.TITLE DRLOG .IDENT /04.03/ ; ; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reserved ; ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; J. R. KAUFFMAN ; J. W. BERZLE ; T. LEKAS ; ; MODIFIED BY: ; ; J. R. KAUFFMAN ; K. L. NOEL ; D. P. RABAHY ; ; MODIFIED FOR RSX-11M-PLUS V4.1 BY: ; ; PAUL K. M. WEISS ; R. D. HANEY ; J. R. KAUFFMAN ; B. S. MCCARTHY ; ; MODIFIED FOR RSX-11M-PLUS V4.2 BY: ; ; K. L. NOEL 12-MAY-88 04.00 ; KLN100 -- KEEP TRACK OF DIRECTORY IN RSX FOR CPR ; ; R. D. HANEY 04-AUG-88 04.01 ; RDH165 -- DO SDIR$ PARAMETER CHECKS BEFORE SENDING PACKET ; ; K. L. NOEL 28-NOV-88 04.02 ; KLN116 -- SAVE $TEMP0 BEFORE CPSEN$ AND RESTORE AFTER ; ; K. L. NOEL 22-DEC-88 04.03 ; KLN120 -- IMPLEMENT SD.MUD FOR SET DEFAULT ; ;+ ; ++$DRLOG-LOGICAL NAME DIRECTIVES ; ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CREATE, DELETE, OR ; TRANSLATE A LOGICAL NAME, SETUP A DEFAULT DIRECTORY STRING, OR ; GET A DEFAULT DIRECTORY STRING BY MEANS OF THE FOLLOWING FIVE ; SUBFUNCTIONS: ; ; CLOG$ ( SUBFUNCTION 0 ) ; ; THE CREATE LOGICAL NAME DIRECTIVE SUBFUNCTION INSTRUCTS THE SYSTEM TO ; CREATE A RELATIONSHIP BETWEEN A SPECIFIED LOGICAL NAME STRING AND A SPECIFIED ; EQUIVALENCE NAME STRING. IF THE LOGICAL NAME STRING ALREADY EXISTS, THE NEW ; DEFINITION WILL SUPERCEDE THE OLD ONE. ; ; CREATE LOGICAL NAME (CLOG$) DPB FORMAT: ; ; WD. 00 -- DIC(207.),DPB SIZE (7.) ; WD. 01 -- SUBFUNCTION CODE (0),MODE ; WD. 02 -- TABLE NUMBER,STATUS ; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER ; WD. 04 -- SIZE OF LOGICAL NAME BUFFER ; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER ; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFER ; ; ; TLOG$ ( SUBFUNCTION 1 ) ; ; THE TRANSLATE LOGICAL NAME DIRECTIVE SUBFUNCTION INSTRUCTS THE SYSTEM ; TO SEARCH FOR THE SPECIFIED LOGICAL NAME IN THE LOGICAL NAME LOGICAL ; NAME TABLES AND RETURN THE EQUIVALENCE NAME STRING TO A USER SPECIFIED ; BUFFER. ; ; THE TBMASK IS AN INHIBIT BITMASK SO THAT THE USER MAY SPECIFY WHICH TABLES ; ARE NOT TO BE SEARCHED. SHOULD THE EQUIVALENCE NAME BUFFER BE TOO SMALL, ; THIS DIRECTIVE WILL RETURN AS MUCH OF THE STRING AS POSSIBLE. THE RETURNED ; STRING LENGTH IS ALWAYS THE BYTE COUNT OF THE EQUIVALENCE NAME STRING RATHER ; THAN THE NUMBER OF CHARACTERS RETURNED TO THE USER BUFFER. ; ; ******************************** NOTE ************************************ ; THIS VERSION OF THE TLOG$ DPB IS FOR P/OS COMPATIBILITY ONLY. ; THE CURRENT DPB FORMAT IS UNDER THE SUBFUNCTION CODE 9. ; ************************************************************************** ; ; TRANSLATE LOGICAL NAME (TLOG$) DPB FORMAT: ; ; WD. 00 -- DIC(207.),DPB SIZE (9.) ; WD. 01 -- SUBFUNCTION CODE (1),MODE ; WD. 02 -- TBMASK,RESERVED BYTE (RECURSION COUNT) ; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER ; WD. 04 -- SIZE OF LOGICAL NAME BUFFER ; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER ; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFER ; WD. 07 -- ADDRESS OF WORD TO RECEIVE SIZE OF RETURNED EQUIV. NAME ; WD. 08 -- ADDRESS OF WORD TO RECEIVE TABLE NUMBER AND MODE ; ; ; DLOG$ ( SUBFUNCTION 2 ) ; ; THE DELETE LOGICAL NAME DIRECTIVE SUBFUNCTION REMOVES THE SPECIFIED LOGICAL ; NAME FROM THE LOGICAL NAME TABLE SPECIFIED. IF THE LOGICAL NAME IS NOT ; SPECIFIED, ALL LOGICAL NAMES IN THE SPECIFIED TABLE ARE REMOVED. ; ; DELETE LOGICAL NAME (DLOG$) DPB FORMAT: ; ; WD. 00 -- DIC(207.),DPB SIZE (5.) ; WD. 01 -- SUBFUNCTION CODE (2),MODE ; WD. 02 -- TABLE NUMBER, STATUS ; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER ; WD. 04 -- SIZE OF LOGICAL NAME BUFFER ; ; SDIR$ ( SUBFUNCTION 3 ) ; ; THE SETUP DEFAULT DIRECTORY STRING DIRECTIVE SUBFUNCTION INSTRUCTS THE SYSTEM ; TO CREATE A DEFAULT DIRECTORY STRING ON A USER BASIS. THIS STRING IS A ; SPECIAL CASE SINCE THERE IS NO LOGICAL STRING PER SE AND ONLY AN EQUIVALENCE ; NAME STRING EXISTS. ; ; SET DEFAULT DIRECTORY STRING (SDIR$) ; ; WD. 00 -- DIC(207.),DPB SIZE (5.) ; WD. 01 -- SUBFUNCTION CODE (3),MODE ; WD. 02 -- RESERVED FOR FUTURE EXPANSIONISM ; WD. 03 -- ADDRESS OF EQUIVALENCE NAME BUFFER ; WD. 04 -- SIZE OF EQUIVALENCE NAME BUFFER ; ; GDIR$ ( SUBFUNCTION 4 ) ; ; THE GET DEFAULT DIRECTORY STRING DIRECTIVE SUBFUNCTION INSTRUCTS THE SYSTEM ; TO RETRIEVE THE DEFAULT DIRECTORY STRING FOR THE CURRENT USER. THE STRING IS ; RETURNED TO THE SPECIFIED USER BUFFER ALONG WITH THE LENGTH OF THE STRING. ; ; GET DEFAULT DIRECTORY STRING (GDIR$) DPB FORMAT: ; ; WD. 00 -- DIC(207.),DPB SIZE (6.) ; WD. 01 -- SUBFUNCTION CODE (4),MODE ; WD. 02 -- RESERVED FOR FUTURE EXPANSION ; WD. 03 -- EQUIVALENCE NAME BUFFER ; WD. 04 -- SIZE OF EQUIVALENCE NAME BUFFER ; WD. 05 -- ADDRESS OF WORD TO RECEIVE SIZE OF RETURNED EQUIV. NAME ; ; ; THE FOLLOWING SUBFUNCTIONS ARE DISPATCHED FROM HERE BUT THE CODE IS ; IN THE MODULE DRPFN.MAC. ; ; FSS$ ( SUBFUNCTION 5 ) ; ; FILE SPECIFICATION SCANNER (FSS$) DPB FORMAT: ; ; WD. 00 -- DIC(207.),DPB SIZE (7.) ; WD. 01 -- SUBFUNCTION CODE (5), RESERVED ; WD. 02 -- RESERVED ; WD. 03 -- ADDRESS OF DIRECTORY SPECIFICATION BUFFER ; WD. 04 -- SIZE OF DIRECTORY SPECIFICATION BUFFER ; WD. 05 -- ADDRESS OF PARSE BLOCK ; WD. 06 -- SIZE OF PARSE BLOCK (IN BYTES) ; ; THE PARSE BLOCK WILL ZEROED AND FILLED IN WITH DESCRIPTORS ; FOR EACH FIELD PRESENT OF NODE, ACCESS, DEVICE, DIRECTORY, ; FILENAME, TYPE, AND VERSION, PLUS THE TRAILING PORTION OF ; THE STRING IF ANY. THE FLAGS WORD WILL BE HAVE A BIT SET FOR ; EACH OF THE COMPONENTS PRESENT IN THE FORMAT FOR THE RMS ; NAM BLOCK. ; ; IN MORE DETAIL. ; ; NODE: THE NODE INCLUDES ALL NODES IF POOR MAN'S ROUTING IS ; IS BEING USED. THE INITIAL NODE NAME IS TERMINATED ; BY THE ACCESS CONTROL STRING ADDRESS, EVEN IF THERE ; IS NONE. (IN THIS CASE THE ACCESS CONTROL LENGTH IS ; ZERO.) ; ; FS$NOD IS SET IF PRESENT. ; ; ACCESS THE ACCESS CONTROL STRING IS THE ENTIRE QUOTED STRING ; CONTROL: TERMINATED BY DOUBLE COLON. AS NOTED ABOVE, THE ADDRESS ; OF THE ACCESS CONTROL SERVES A DUAL PURPOSE. ; ; DEVICE: THE DEVICE IS THE STRING TERMINATED BY A SINGLE COLON. ; ; FS$DEV IS SET IF PRESENT. ; ; DIRECTORY:THE DIRECTORY IS THE STRING BOUNDED BY EITHER [] OR ; <> AND INCLUDES A RATHER LOOSELY CHECKED SET OF ; CHARACTERS VALID IN A DIRECTORY SPECIFICATION INCLUDING ; WILDCARDS, HIERARCHIES, ETC. THE SYNTAX OF THE DIRECTORY ; MUST BE CHECKED FOR VALIDITY IN THE CONTEXT OF THE ; OPERATION, FOR EXAMPLE, NETWORK ACCESS. ; ; FS$DIR IS SET IF PRESENT. IN ADDITION, IF WILDCARDS ; ARE FOUND, FS$WDI IS ALSO SET. (WILDCARDS ARE "%", "*", ; AND "...". ; ; FILENAME: THE FILENAME IS THE STRING TERMINATED BY ".", ";", OR ; THE END OF THE FILE SPECIFICATION. ; ; FS$NAM IS SET IF PRESENT. IN ADDITION, IF WILDCARDS ; ARE FOUND, FS$WNA IS ALSO SET. (WILDCARDS ARE "%" AND ; "*".) ; ; IF FS$QUO IS SET, THE FILE SPECIFICATION IS ; A QUOTED STRING. THIS IS EITHER A "FOREIGN" FILESPEC ; IF BEING PASSED TO ANOTHER SYSTEM (EG. VIA DAP) OR ; AN ANSI FILESPEC. THE THE CASE OF THE ANSI FILE, ; A VERSION IS ALLOWED, BUT NO TYPE FIELD. IN THE CASE ; OF A NETWORK OPERATION, IT'S AMBIGUOUS, BUT A VERSION ; WILL BE ALLOWED BUT NOT DEFAULTED. (ACTUALLY THIS ; DOESN'T RELATE TO FSS BUT THIS SEEMS TO BE AS GOOD ; A PLACE TO MENTION IT AS ANY.) ; ; TYPE: THE TYPE IS THE STRING TERMINATED BY A "." OR ";" OR ; THE END OF THE FILE SPECIFICATION. A LEADING "." IS ; ALWAYS INCLUDED IN THE STRING. ; ; FS$TYP IS SET IF PRESENT. IN ADDITION, IF WILDCARDS ; ARE FOUND, FS$WTY IS ALSO SET. (WILDCARDS ARE "%" AND ; "*".) ; ; IF THE FILENAME IS A QUOTED STRING, THEN THIS FIELD ; MUST BE NULL. ; ; VERSION: THE VERSION IS THE FIELD INCLUDING A LEADING "." OR ; ";" TERMINATED BY THE END OF THE STRING. THE STRING ; IS LIMITED TO AN OPTIONAL LEADING "-" AND THE DIGITS ; ZERO TO NINE, OR A "*" WILDCARD. ; ; FS$VER IS SET IF PRESENT. IN ADDITION, IF A WILDCARD ; IS FOUND, FS$WVE IS ALSO SET. ; ; TRAILING: THE UNPARSED PORTION OF THE INITIAL STRING IS THAT PART ; OF THE INPUT THAT WAS SUCCESSFULLY AND COMPLETELY ; PARSED. IF AN ERROR IS DETECTED IN THE DIRECTORY ; SPECIFICATION, FOR EXAMPLE, THE TRAILING STRING WILL ; INCLUDE THE ERRONEOUS DIRECTORY SPECIFICATION. ; ; THIS SHOULD ALLOW THE USED OF FSS$ IN COMMAND LINE ; PARSING. ANY CHARACTER NOT PART OF A FILE SPECIFICATION ; TERMINATES THE SCAN AND RESULTS IN ALL INFORMATION ; OBTAINED SO FAR TO BE RETURNED. ; ; THE FIELD TRAILING_ADDR SHOULD ALWAYS BE FILLED IN ; EVEN WHEN THE LENGTH IS ZERO. THIS IS DIFFERENT ; FROM THE NORM, BUT IS AN EXCEPTION FOR MUCH THE ; SAME REASON AS FOR ACCESS_ADDR. ; ; THE PARSE BLOCK CAN BE TRUNCATED BY THE USER IF NOT ALL FIELDS ; ARE DESIRED, ALTHOUGH THE ORGANIZATION ISN'T WELL SETUP FOR THAT. ; THE DIRECTIVE CAN ALSO BE ENHANCED BY ADDING FIELDS ON THE END. ; ; ACHN$ ( SUBFUNCTION 6 ) ; ; ASSIGN CHANNEL (ACHN$) DPB FORMAT: ; ; WD. 00 -- DIC(207.),DPB SIZE (5.) ; WD. 01 -- SUBFUNCTION CODE (6),RESERVED ; WD. 02 -- LUN, TABLE MASK ; WD. 03 -- ADDRESS OF FILE SPECIFICATION ; WD. 04 -- SIZE OF FILE SPECIFICATION ; ; ASSIGN CHANNEL DOES ALL OF THE PROCESSING OF THE FILE ; SPECIFICATION THAT IS REQUIRED TO FIND THE ACTUAL DEVICE ; NAME AND THEN ASSIGNS THE LUN TO THAT DEVICE. ; ; ; PRMS$ ( SUBFUNCTION 7 ) ; ; PARSE FOR RMS (PRMS$) DPB FORMAT: ; ; WD. 00 -- DIC(207.),DPB SIZE (12.) ; WD. 01 -- SUBFUNCTION CODE (7), LUN ; WD. 02 -- TABLE MASK, RESERVED ; WD. 03 -- ADDRESS OF PRIMARY STRING ; WD. 04 -- SIZE OF PRIMARY STRING ; WD. 05 -- ADDRESS OF RESULTANT STRING BUFFER ; WD. 06 -- SIZE OF RESULTANT STRING BUFFER ; WD. 07 -- ADDRESS OF WORD TO RECEIVE RESULTANT STRING SIZE ; WD. 08 -- ADDRESS OF PARSE BLOCK ; WD. 09 -- SIZE OF PARSE BLOCK ; WD. 10 -- ADDRESS OF DEFAULT STRING ; WD. 11 -- SIZE OF DEFAULT STRING ; ;######## ADD DESCRIPTION ; ; ; PFCS$ ( SUBFUNCTION 8 ) ; ; PARSE FOR FCS (PFCS$) DPB FORMAT: ; ; WD. 00 -- DIC(207.),DPB SIZE (12.) ; WD. 01 -- SUBFUNCTION CODE (8), LUN ; WD. 02 -- TABLE MASK, RESERVED ; WD. 03 -- ADDRESS OF PRIMARY STRING ; WD. 04 -- SIZE OF PRIMARY STRING ; WD. 05 -- ADDRESS OF RESULTANT STRING BUFFER ; WD. 06 -- SIZE OF RESULTANT STRING BUFFER ; WD. 07 -- ADDRESS OF WORD TO RECEIVE RESULTANT STRING SIZE ; WD. 08 -- ADDRESS OF PARSE BLOCK ; WD. 09 -- SIZE OF PARSE BLOCK ; WD. 10 -- ADDRESS OF DEFAULT NAME BLOCK ; WD. 11 -- SIZE OF DEFAULT NAME BLOCK ; ;######## ADD DESCRIPTION ; ; INPUTS: ; ; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK ; R3=ADDRESS OF THE SECOND WORD IN THE DPB ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK ; ; ; TLOG$ ( SUBFUNCTION 9 ) ; ; THE TRANSLATE LOGICAL NAME DIRECTIVE SUBFUNCTION INSTRUCTS THE SYSTEM TO ; SEARCH FOR THE SPECIFIED LOGICAL NAME IN THE LOGICAL NAME LOGICAL NAME ; TABLES AND RETURN THE EQUIVALENCE NAME STRING TO A USER SPECIFIED BUFFER. ; THE TBMASK IS AN INHIBIT BITMASK SO THAT THE USER MAY SPECIFY WHICH TABLES ; ARE NOT TO BE SEARCHED. SHOULD THE EQUIVALENCE NAME BUFFER BE TOO SMALL, ; THIS DIRECTIVE WILL RETURN AS MUCH OF THE STRING AS POSSIBLE. THE RETURNED ; STRING LENGTH IS ALWAYS THE BYTE COUNT OF THE EQUIVALENCE NAME STRING RATHER ; THAN THE NUMBER OF CHARACTERS RETURNED TO THE USER BUFFER. ; ; TRANSLATE LOGICAL NAME (TLOG$) DPB FORMAT: ; ; WD. 00 -- DIC(207.),DPB SIZE (10.) ; WD. 01 -- SUBFUNCTION CODE (1),MODE ; WD. 02 -- TBMASK, STATUS ; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER ; WD. 04 -- SIZE OF LOGICAL NAME BUFFER ; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER ; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFER ; WD. 07 -- ADDRESS OF WORD TO RECEIVE SIZE OF RETURNED EQUIV. NAME ; WD. 08 -- ADDRESS OF WORD TO RECEIVE TABLE NUMBER AND MODE ; WD. 09 -- ADDRESS OF WORD TO RECEIVE STATUS FROM LOGICAL BLOCK ; ; ; RLOG$ ( SUBFUNCTION 10. ) ; ; THE RECURSIVE TRANSLATE LOGICAL NAME DIRECTIVE SUBFUNCTION INSTRUCTS THE ; SYSTEM TO SEARCH FOR THE SPECIFIED LOGICAL NAME IN THE LOGICAL NAME LOGICAL ; NAME TABLES AND RETRANSLATE THE EQUIVALENCE NAME STRING FURTHER UNTIL NO ; MORE EQUIVALENCE NAMES MAY BE FOUND. AT THAT TIME THE FINAL EQUIVALENCE ; NAME IS RETURNED TO A USER SPECIFIED BUFFER. ; THE TBMASK IS AN INHIBIT BITMASK SO THAT THE USER MAY SPECIFY WHICH TABLES ; ARE NOT TO BE SEARCHED. SHOULD THE EQUIVALENCE NAME BUFFER BE TOO SMALL, ; THIS DIRECTIVE WILL RETURN AS MUCH OF THE STRING AS POSSIBLE. THE RETURNED ; STRING LENGTH IS ALWAYS THE BYTE COUNT OF THE EQUIVALENCE NAME STRING RATHER ; THAN THE NUMBER OF CHARACTERS RETURNED TO THE USER BUFFER. ; ; RECURSIVE TRANSLATE LOGICAL NAME (RLOG$) DPB FORMAT: ; ; WD. 00 -- DIC(207.),DPB SIZE (10.) ; WD. 01 -- SUBFUNCTION CODE (9),MODE ; WD. 02 -- TBMASK, STATUS ; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER ; WD. 04 -- SIZE OF LOGICAL NAME BUFFER ; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER ; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFER ; WD. 07 -- ADDRESS OF WORD TO RECEIVE SIZE OF RETURNED EQUIV. NAME ; WD. 08 -- ADDRESS OF WORD TO RECEIVE TABLE NUMBER AND MODE ; WD. 09 -- ADDRESS OF WORD TO RECEIVE STATUS FROM LOGICAL BLOCK ; ; ; CLON$ ( SUBFUNCTION 11. ) ; ; THE CREATE LOGICAL NAME DIRECTIVE SUBFUNCTION INSTRUCTS THE SYSTEM TO ; CREATE A RELATIONSHIP BETWEEN A SPECIFIED LOGICAL NAME STRING AND A SPECIFIED ; EQUIVALENCE NAME STRING. IF THE LOGICAL NAME STRING ALREADY EXISTS, THE NEW ; DEFINITION WILL SUPERSEDE THE OLD ONE. ; ; CREATE LOGICAL NAME (CLON$) DPB FORMAT: ; ; WD. 00 -- DIC(207.),DPB SIZE (7.) ; WD. 01 -- SUBFUNCTION CODE (11.),MODE ; WD. 02 -- TABLE NUMBER,STATUS ; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER ; WD. 04 -- SIZE OF LOGICAL NAME BUFFER ; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER ; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFER ; ; ; DLON$ ( SUBFUNCTION 12. ) ; ; THE DELETE LOGICAL NAME DIRECTIVE SUBFUNCTION REMOVES THE SPECIFIED LOGICAL ; NAME FROM THE LOGICAL NAME TABLE SPECIFIED. IF THE LOGICAL NAME IS NOT ; SPECIFIED, ALL LOGICAL NAMES IN THE SPECIFIED TABLE ARE REMOVED. ; ; DELETE LOGICAL NAME (DLON$) DPB FORMAT: ; ; WD. 00 -- DIC(207.),DPB SIZE (5.) ; WD. 01 -- SUBFUNCTION CODE (12.),MODE ; WD. 02 -- TABLE NUMBER, STATUS ; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER ; WD. 04 -- SIZE OF LOGICAL NAME BUFFER ; ; ; TLON$ ( SUBFUNCTION 13. ) ; ; THE TRANSLATE LOGICAL NAME DIRECTIVE SUBFUNCTION INSTRUCTS THE SYSTEM TO ; SEARCH FOR THE SPECIFIED LOGICAL NAME IN THE LOGICAL NAME LOGICAL NAME ; TABLES AND RETURN THE EQUIVALENCE NAME STRING TO A USER SPECIFIED BUFFER. ; THE TBMASK IS AN INHIBIT BITMASK SO THAT THE USER MAY SPECIFY WHICH TABLES ; ARE NOT TO BE SEARCHED. SHOULD THE EQUIVALENCE NAME BUFFER BE TOO SMALL, ; THIS DIRECTIVE WILL RETURN AS MUCH OF THE STRING AS POSSIBLE. THE RETURNED ; STRING LENGTH IS ALWAYS THE BYTE COUNT OF THE EQUIVALENCE NAME STRING RATHER ; THAN THE NUMBER OF CHARACTERS RETURNED TO THE USER BUFFER. ; ; TRANSLATE LOGICAL NAME (TLON$) DPB FORMAT: ; ; WD. 00 -- DIC(207.),DPB SIZE (10.) ; WD. 01 -- SUBFUNCTION CODE (13.),MODE ; WD. 02 -- TBMASK, STATUS ; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER ; WD. 04 -- SIZE OF LOGICAL NAME BUFFER ; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER ; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFER ; WD. 07 -- ADDRESS OF WORD TO RECEIVE SIZE OF RETURNED EQUIV. NAME ; WD. 08 -- ADDRESS OF WORD TO RECEIVE TABLE NUMBER AND MODE ; WD. 09 -- ADDRESS OF WORD TO RECEIVE STATUS FROM LOGICAL BLOCK ; ; ; RLON$ ( SUBFUNCTION 14. ) ; ; THE RECURSIVE TRANSLATE LOGICAL NAME DIRECTIVE SUBFUNCTION INSTRUCTS THE ; SYSTEM TO SEARCH FOR THE SPECIFIED LOGICAL NAME IN THE LOGICAL NAME LOGICAL ; NAME TABLES AND RETRANSLATE THE EQUIVALENCE NAME STRING FURTHER UNTIL NO ; MORE EQUIVALENCE NAMES MAY BE FOUND. AT THAT TIME THE FINAL EQUIVALENCE ; NAME IS RETURNED TO A USER SPECIFIED BUFFER. ; THE TBMASK IS AN INHIBIT BITMASK SO THAT THE USER MAY SPECIFY WHICH TABLES ; ARE NOT TO BE SEARCHED. SHOULD THE EQUIVALENCE NAME BUFFER BE TOO SMALL, ; THIS DIRECTIVE WILL RETURN AS MUCH OF THE STRING AS POSSIBLE. THE RETURNED ; STRING LENGTH IS ALWAYS THE BYTE COUNT OF THE EQUIVALENCE NAME STRING RATHER ; THAN THE NUMBER OF CHARACTERS RETURNED TO THE USER BUFFER. ; ; RECURSIVE TRANSLATE LOGICAL NAME (RLON$) DPB FORMAT: ; ; WD. 00 -- DIC(207.),DPB SIZE (10.) ; WD. 01 -- SUBFUNCTION CODE (14.),MODE ; WD. 02 -- TBMASK, STATUS ; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER ; WD. 04 -- SIZE OF LOGICAL NAME BUFFER ; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER ; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFER ; WD. 07 -- ADDRESS OF WORD TO RECEIVE SIZE OF RETURNED EQUIV. NAME ; WD. 08 -- ADDRESS OF WORD TO RECEIVE TABLE NUMBER AND MODE ; WD. 09 -- ADDRESS OF WORD TO RECEIVE STATUS FROM LOGICAL BLOCK ; .IF DF L$$GCL!N$$DIR .MCALL LNMDF$,LNMOD$ LNMDF$ LNMOD$ ;DEFINE ADDITIONAL LOGICAL NAME OFFSETS MAP5=120000 MAP6=140000 LN$SIZ = 255. ;MAXIMUM SIZE OF LOGICAL AND EQUIVALENCE BUFFERS H$$HNM = 32. ;NUMBER OF HASH CELLS IN EACH HASH TABLE T$BLNM == 4 ;HIGHEST VALID LOGICAL NAME TABLE NUMBER M$XLOG = 10. ;MAXIMUM RECURSION NUMBER FOR LOGICAL LOOKUPS P$SSIZ = 9. ;DPB SIZE OF P/OS COMPATIBLE TLOG$ DIRECTIVE D$COM4 = 4 ;INDICATOR VALUE FOR THE 4TH DIRECTIVE COMMON R$LOG = 10. ;SUBFUNCTION CODE FOR RLOG OPERATION R$LON = 14. ;SUBFUNCTION CODE FOR RLON OPERATION R$XBAS = 11. ;SUBFUNCTIONS BELOW THIS ARE XLOG$ GD$SIZ = 14 ;SIZE OF GDIR DPB GD$BUF = 4 ;SIZE OF EXTRA CPRBUF STORAGE AREA FOR GDIR SD$SIZ = 12 ;SIZE OF SDIR DPB CL$SIZ = 16 ;SIZE OF CLOG DPB DL$SIZ = 12 ;SIZE OF DLOG DPB TL$SIZ = 24 ;SIZE OF TLOG DPB .SBTTL ENTRY POINT FOR ALL ROUTINES IN DRLOG ; ; ; REVERIFY DPB ADDRESS GIVEN THAT THE POINTER GOING INTO THE ROUTINES NO LONGER ; POINTS PAST THE FUNCTION CODE WORD. ; ; $DRLG1:: .IF DF C$$RLG ;IF REMOTE LOGICAL NAMES CMPB #145.,-2(R3) ;WAS THIS AN ELP DIRECTIVE? BNE 5$ ;NOPE, IT WAS A REGULAR LOGICAL NAME DIRECTIVE MOV #$LNELP,-(SP) ;GET ELP ENTRY POINT BR 20$ ;AND GO OFF TO DO THE DIRECTIVE 5$: .ENDC ;C$$RLG MOVB (R3),R0 ;GET THE FUNCTION CODE FROM DPB CMPB R0,#$LNFHI ;IS IT TOO HIGH? BHI 10$ ;IF HI, YES ASL R0 ;GET OFFSET INTO TABLE BY MULTIPLYING BY 4 ASL R0 ; ADD #$LNSFT,R0 ;POINT INTO FUNCTION TABLE MOV (R0)+,-(SP) ;GET THE COMPLETION ROUTINE ADDRESS FROM TABLE CMPB (R0)+,$DICSV+1 ;DOES THE DPB SIZE MATCH? BNE 10$ ;IF NE, NO .IF DF L$$GCL MOV $TKTCB,R1 ;GET THE CURRENT TCB ADDRESS MOV T.UCB(R1),R1 ;GET THE CURRENT TI: OF THE TASK CALL $GTUSR ;SET UP THE USER LOGICAL HASH TABLE ADDRESS .ENDC ;DF L$$GCL CMPB #D$COM4,(R0)+ ;DOES THIS FUNCTION LIVE IN ANOTHER DIRCOM BEQ 20$ ;IF EQ, YES, SWITCH TO IT CALLR @(SP)+ ;PROCESS THE FUNCTION TYPE 10$: DRSTS D.RS99 ;RETURN DIRECTIVE STATUS -- DPB SIZE INVALID 20$: CALL $MPDC4 ;CALL THE ROUTINE IN THE OTHER DIRECTIVE COMMON RETURN ;RETURN BACK TO DISPATCHER SUCCESFULLY .PAGE .SBTTL ACROB - ROUTINE TO VALIDATE USER BUFFER ADDRESSES .ENABL LSB ;+ ; ; THESE ROUTINES ADDRESS CHECK AND CALCULATE THE BIAS AND DISPLACEMENT (APR6) ; OF A SPECIFIED USER BUFFER. ; ; INPUTS: ; R3 = THE ADDRESS OF THE TWO WORDS IN THE DPB ; CONTAINING THE USER VIRTUAL ADDRESS AND THE ; BYTE COUNT SIZE OF THAT BUFFER ; ; ; OUTPUTS: ; ; R0 = THE BYTECOUNT OF THE USER BUFFER ; R1 = THE BIAS OF THE USER BUFFER ; R2 = THE APR6 DISPLACEMENT OF THE USER BUFFER ; R3 = R3+4 ; R4 = UNCHANGED ; ; AN ERROR CONDITION IN THIS ROUTINE CAUSES AN IMMEDIATE DIRECTIVE ERROR ; TRAP PREVENTING ANY RETURN TO THE CALLING ROUTINE. ;- ACROB: MOV #$ACHKB,-(SP) ;ADDRESS CHECK BUFFER RW BR 10$ ;GO TO COMMON PROCESSING ACRIB: MOV #$ACHRO,-(SP) ;ADDRESS CHECK BUFFER RO 10$: MOV (R3)+,R0 ;GET THE ADDRESS OF THE USER BUFFER BEQ 20$ ;IF EQ, THERE IS NONE MOV (R3)+,R1 ;GET SIZE OF BUFFER BEQ 30$ ;IF EQ, IT IS NONEXISTENT CMP R1,#LN$SIZ ;IS IT TOO LARGE BHI 30$ ;IF HI, YES CALL @(SP)+ ;CALL THE CHECKING ROUTINE BCS 20$ ;IF CS, BUFFER IS INVALID CALL $RELOC ;SET UP THE APR BIAS AND OFFSET FOR BUFFER MOV -2(R3),R0 ;SET UP THE SIZE OF BUFFER RETURN 20$: DRSTS D.RS98 ;ADDRESS CHECK ERROR 30$: DRSTS D.RS89 ;INVALID BUFFER SIZE .DSABL LSB .ENDC ; DF L$$GCL!N$$DIR .PAGE .SBTTL $LNFCL - LOGICAL NAME CREATION DIRECTIVE .IF DF L$$GCL .ENABL LSB ;+ ; $LNFCL - ENTRY POINT FOR LOGICAL NAME CREATION ; ; THIS ROUTINE IS ENTERED FROM THE DRLOG DISPATCH AREA WITH R3 POINTING TO ; THE FOLLOWING DPB VALUES: ; ; WD. 01 -- SUBFUNCTION CODE (0),MODE ; WD. 02 -- TABLE NUMBER,STATUS ; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER ; WD. 04 -- SIZE OF LOGICAL NAME BUFFER ; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER ; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFER ; $LNFCL:: .IF DF C$$RLG ; REMOTE LOGICAL SUPPORT .MCALL CPRDF$ CPRDF$ BIT #F5.RLG,$FMSK5 ;ARE WE USING REMOTE LOGICAL? BEQ 9$ ;IF EQ NO ; ; GET A REQUEST PACKET FROM CPRBUF ; MOV 6(R3),R1 ;GET SIZE OF USER BUFFER BEQ 1$ ;NULL NOT ALLOWED CMP R1,#LN$SIZ ;IS SIZE TOO BIG? BLOS 2$ ;IF LOS NO 1$: DRSTS D.RS89 ;RETURN ILLEGAL BUFFER LENGTH 2$: CMP 12(R3),#LN$SIZ ;IS EQUIVALENCE STRING TOO BIG? BHI 1$ ;IF HI YES ADD 12(R3),R1 ;INCLUDE ENOUGH SPACE FOR EQUIV. STRING ADD #,R1 ;ADD SIZE OF HEADER & DPB MOV R1,R4 ;SAVE SIZE OF REQUEST PACKET FOR CPSEN$ ADD #77,R1 ;ROUND R1 TO NEAREST 32. WORD BLOCK ASH #-6,R1 ; MOV R3,R5 ;SAVE DPB POINTER MOV #AL$BCK!AL$IMP,R0 ;BLOCK THE TASK, DO IMPLICIT START CALL $CPALO ;GET BUFFER FROM CPRBUF ; ; FILL IN REQUEST PACKET ; MOV R4,-(SP) ;SAVE SIZE OF REQUEST MOV R0,-(SP) ;SAVE PACKET BIAS MOV R0,KISAR6 ;MAP PACKET MOV #MAP6,R1 ;GET ADDRESS OF HEADER ; ; LOAD HEADER AREA ; MOVB #HT$DIR,H$TYPE(R1) ;DIRECTIVE REQUEST CLRB H$ICNT(R1) ;NO ITEMS ; ; LOAD PARAMETER AREA ; ADD #P$DPB,R1 ;POINT TO DPB AREA MOV -2(R5),(R1)+ ;COPY DIC AND SIZE MOV (R5),(R1)+ ;COPY SUBFUNCTION CODE AND MODIFIER MOV 2(R5),(R1)+ ;TABLE NUMBER & STATUS MOV #,(R1)+ ;ADDRESS OF LOGICAL NAME BUFFER MOV 6(R5),(R1)+ ;SIZE OF LOGICAL NAME MOV #,(R1) ;CALCULATE ADDRESS OF EQUIV STRING BUFFER ADD 6(R5),(R1)+ ;SKIP OVER LOGICAL NAME BUFFER MOV 12(R5),(R1)+ ;SIZE OF EQUIVALENCE STRING ; ; COPY LOGICAL NAME INTO PACKET ; MOV 4(R5),R0 ;USER ADDRESS OF BUFFER MOV 6(R5),R1 ;SIZE OF BUFFER FOR ADDRESS CHECK CALL $ACHKB ;CHECK ADDRESS BCS 8$ ;IS CS ERROR CALL $RELOC ;GET SOURCE BIAS AND DISPLACEMENT ; ; R1 := BIAS ; R2 -> APR6 DISPLACEMENT ; SUB #MAP6-MAP5,R2 ;MAKE SOURCE DISPLACEMENT AN APR5 DISPLACEMENT MOV (SP),R3 ;GET DEST BIAS MOV #,R4 ;GET DEST DISPLACEMENT MOV 6(R5),R0 ;GET SIZE OF TRANSFER CALL $BLXIO ;TRANSFER LOGICAL NAME INTO BUFFER ; ; COPY EQUIVALENCE STRING INTO PACKET ; MOV 10(R5),R0 ;USER ADDRESS OF BUFFER MOV 12(R5),R1 ;SIZE OF BUFFER FOR ADDRESS CHECK CALL $ACHKB ;CHECK ADDRESS BCS 8$ ;IS CS ERROR CALL $RELOC ;GET SOURCE BIAS AND DISPLACEMENT SUB #MAP6-MAP5,R2 ;MAKE SOURCE DISPLACEMENT AN APR5 DISPLACEMENT MOV (SP),R3 ;GET DEST BIAS MOV #,R4 ;CALCULATE DEST DISPLACEMENT ADD 6(R5),R4 ;SKIP OVER LOGICAL NAME BUFFER MOV 12(R5),R0 ;GET SIZE OF TRANSFER CALL $BLXIO ;TRANSFER EQUIVALENCE STRING INTO BUFFER MOV (SP)+,R0 ;GET PACKET BIAS BACK MOV (SP)+,R4 ;GET PACKET LENGTH BACK CPSEN$ #SN$DIR,R0,R4 ;SEND REQUEST TO CPRAME CALLR $CPDEA ;RELEASE THE CPRBUF SPACE ; ; HANDLE ERRORS ; 8$: MOV (SP)+,R0 ;GET PACKET BIAS TST (SP)+ ;CLEAN OFF STACK CALL $CPDEA ;DEALLOCATE BUFFER DRSTS D.RS98 ;ADDRESS ERROR 9$: .ENDC ; C$$RLG MOV #$LGBUF,R4 ;GET POINTER TO START OF STORAGE AREA MOV (R3)+,-(SP) ;STORE THE SUBFUNCTION CODE AND MODE MOVB (R3),(SP) ;MOVE THE TABLE NUMBER TO STORAGE AREA CMPB #T$BLNM,(SP) ;IS THE TABLE NUMBER VALID BLO 50$ ;IF LO, NO, EXIT ; ; VERIFY THE DPB ARGUMENTS AND SET UP A DESCRIPTOR BLOCK TO PASS TO THE ; ACTION ROUTINE THAT ACTUALLY CREATES AND PLACES THE LNB. ; MOV (SP)+,(R4)+ ;MOVE IN THE TABLE AND BLOCK NUMBER MOV $TKTCB,R2 ;GET THE CURRENT TASK TCB MOV T.UCB(R2),R5 ;GET THE CURRENT TI: ADDRESS TSTB (R3) ;SEE IF THIS IS A SYSTEM LOGICAL CREATION BNE 10$ ;IF NE, NO BIT #T3.PRV,T.ST3(R2); IS THE TASK PRIVILEGED? BEQ 60$ ;IF EQ, NO, DON'T ALLOW CREATION 10$: CMPB #LT.TSK,(R3) ;IS THIS A TASK CREATION BEQ 20$ ;IF EQ, YES, LEAVE TCB ADDRESS MOV R5,R2 ;GET UCB ADDRESS INSTEAD OF TCB 20$: CMPB #LT.GRP,(R3) ;IS THIS A GROUP TABLE CREATION? BNE 30$ ;IF NE, NO, LEAVE GROUP ENTRY BLANK CALL GTUIC ;GET THE CURRENT TASKS PROTECTION UIC GROUP CODE MOVB R1,(R3) ;FILL IN THE GROUP CODE FROM PROTECTION UIC 30$: SWAB (R3) ;SWITCH THE STATUS AND GROUP BYTE MOV (R3)+,(R4)+ ;MOVE THE STATUS AND GROUP TO DESCRIPTOR MOV R2,(R4)+ ;MOVE TCB/UCB ADDRESS INTO DESCRIPTOR CALL ACRIB ;VALIDATE IT IN THE USER TASK IMAGE CALL PSCNV ;CONVERT TO P/OS STYLE IF NECESSARY BCS 80$ ;IF CS, INVALID DEVICE MOV R0,(R4)+ ;MOVE IN THE SIZE OF THE LOGICAL NAME MOV R1,(R4)+ ;MOVE IN THE APR BIAS OF THE BUFFER MOV R2,(R4)+ ;MOVE IN THE KISAR6 BIASED OFFSET OF BUFFER CALL ACRIB ;VALIDATE EQUIVALENCE NAME BUFFER ADDRESS MOV R0,(R4)+ ;MOVE IN THE SIZE OF THE EQUIVALENCE NAME MOV R1,(R4)+ ;MOVE IN THE APR BIAS OF THE BUFFER MOV R2,(R4)+ ;MOVE IN THE KISAR6 BIASED OFFSET OF BUFFER MOV #$LGBUF,R5 ;POINT TO START OF DESCRIPTOR BLOCK AGAIN ; ; AT THIS POINT A DESCRIPTOR BLOCK WITH ALL VALIDATED PARAMETERS HAS BEEN ; CREATED AND POINTED TO BY R5. THIS BLOCK HAS THE STRUCTURE: ; ; ----------------------------------------------- ; | BLOCK NUMBER | TABLE NUMBER | ; ----------------------------------------------- ; | GROUP NUMBER | STATUS BYTE | ; ----------------------------------------------- ; | TCB / UCB ADDRESS | ; ----------------------------------------------- ; | SIZE OF LOGICAL NAME IN BUFFER | ; ----------------------------------------------- ; | 32 WD APR ADDRESS OF START OF LOGICAL | ; ----------------------------------------------- ; | APR6 BIASED OFFSET TO START OF LOGICAL | ; ----------------------------------------------- ; | SIZE OF EQUIVALENCE NAME IN BUFFER | ; ----------------------------------------------- ; | 32 WD APR ADDRESS OF START OF EQUIVALENCE | ; ----------------------------------------------- ; | APR6 BIASED OFFSET TO START OF EQUIVALENCE| ; ----------------------------------------------- ; CALL $CRLOG ;CREATE AND INSERT A LOGICAL NAME BLOCK BCS 70$ ;IF C BIT SET, AN ALLOCATION FAILURE OCCURRED TST R1 ;CHECK FOR SUPERCESSION OF PREVIOUS ENTRY BNE 40$ ;IF NE, WE HAD SUPERCESSION RETURN ;OTHERWISE, SIMPLY RETURN ; 40$: DRSTS D.RSP3 ;RETURN A STATUS OF LOGICAL SUPERCEDED 50$: DRSTS D.RS20 ;INVALID TABLE NUMBER 60$: DRSTS D.RS16 ;PRIVILEGE VIOLATION 70$: DRSTS D.RS1 ;SECONDARY POOL ALLOCATION FAILURE 80$: DRSTS D.RS92 ;IE.IDU - INVALID DEVICE STATUS .PAGE .SBTTL $LNDEL - LOGICAL NAME DELETION DIRECTIVE ;+ ; $LNDEL - ENTRY POINT FOR LOGICAL NAME DELETION ; ; THE ROUTINE IS ENTERED FROM THE DRLOG DISPATCH AREA WITH R3 POINTING TO THE ; FOLLOWING DPB ENTRIES: ; ; WD. 01 -- SUBFUNCTION CODE (2),MODE ; WD. 02 -- TABLE NUMBER, STATUS ; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER ; WD. 04 -- SIZE OF LOGICAL NAME BUFFER ; ;- $LNDEL:: .IF DF C$$RLG ; REMOTE LOGICAL SUPPORT BIT #F5.RLG,$FMSK5 ;ARE WE USING REMOTE LOGICAL? BNE 100$ ;IF NE YES JMP 109$ ;PERFORM NORMAL PROCESSING 100$: ; ; GET A REQUEST PACKET FROM CPRBUF ; MOV 6(R3),R1 ;GET SIZE OF USER BUFFER CMP R1,#LN$SIZ ;IS IT TOO LARGE? BLOS 105$ ;IF LO OR SAME NO DRSTS D.RS89 ;INVALID BUFFER SIZE 105$: ADD #,R1 ;ADD SIZE OF HEADER & DPB MOV R1,R4 ;SAVE SIZE OF REQUEST PACKET FOR CPSEN$ ADD #77,R1 ;ROUND R1 TO NEAREST 32. WORD BLOCK ASH #-6,R1 ; MOV #AL$BCK!AL$IMP,R0 ;BLOCK THE TASK, DO IMPLICIT START MOV R3,R5 ;SAVE DPB POINTER CALL $CPALO ;GET BUFFER FROM CPRBUF ; ; FILL IN REQUEST PACKET AND SEND TO CPRAME ; MOV R4,-(SP) ;SAVE SIZE OF REQUEST MOV R0,-(SP) ;SAVE PACKET BIAS MOV R0,KISAR6 ;MAP PACKET MOV #MAP6,R1 ;GET ADDRESS OF HEADER MOVB #HT$DIR,H$TYPE(R1) ;DIRECTIVE REQUEST CLRB H$ICNT(R1) ;NO ITEMS ADD #P$DPB,R1 ;POINT TO DPB AREA MOV -2(R5),(R1)+ ;COPY DIC AND SIZE MOV (R5),(R1)+ ;COPY SUBFUNCTION CODE AND MODIFIER MOV 2(R5),(R1)+ ;COPY TABLE NUMBER TST 4(R5) ;DELETE ALL LOGICALS? BNE 106$ ;NO CLR (R1)+ ;NO ADDRESS OF LOGICAL NAME BUFFER CLR (R1)+ BR 108$ ;DON'T COPY LOGICAL NAME 106$: MOV #,(R1)+ ;ADDRESS OF LOGICAL NAME BUFFER MOV 6(R5),(R1)+ ;SIZE OF LOGICAL NAME BUFFER ; ; COPY LOGICAL NAME INTO PACKET ; MOV 4(R5),R0 ;USER ADDRESS OF BUFFER MOV 6(R5),R1 ;SIZE OF BUFFER FOR ADDRESS CHECK CALL $ACHKB ;CHECK ADDRESS BCS 8$ ;IS CS ERROR CALL $RELOC ;GET SOURCE BIAS AND DISPLACEMENT ; ; R1 := BIAS ; R2 -> APR6 DISPLACEMENT ; SUB #MAP6-MAP5,R2 ;MAKE SOURCE DISPLACEMENT AN APR5 DISPLACEMENT MOV (SP),R3 ;GET DEST BIAS MOV #,R4 ;GET DEST DISPLACEMENT MOV 6(R5),R0 ;GET SIZE OF TRANSFER CALL $BLXIO ;TRANSFER LOGICAL NAME INTO BUFFER 108$: MOV (SP)+,R0 ;GET PACKET BIAS BACK MOV (SP)+,R4 ;GET PACKET LENGTH BACK CPSEN$ #SN$DIR,R0,R4 ;SEND REQUEST TO CPRAME CALLR $CPDEA ;DEALLOCATE BUFFER 109$: .ENDC ; C$$RLG ; ; CREATE A DESCRIPTOR BLOCK TO SEARCH THE APPROPRIATE TABLE FOR ALL LOGICALS ; OR FOR A SPECIFIC ONE. THE DESCRIPTOR IS A FOUR WORD BLOCK BEGINNING AT ; LOCATION $TEMP0 IN SYSCM AND CONTAINS THE APR BIAS AND OFFSET AND SIZE OF ; A SPECIFIC LOGICAL (OR ZEROES IF ALL) AND THE UCB ADDRESS TO MATCH (TCB, ; IF TASK LOGICAL DELETE). ; MOV #$TONYL,R5 ;GET ADDRESS OF DESCRIPTOR BLOCK TO BE FILLED MOV (R3)+,-(SP) ;STORE THE MODE VALUE FOR LATER USE ; ; GET THE APPROPRIATE UCB (OR TCB, IF TASK LOGICAL) ; MOV $TKTCB,R2 ;GET TASK TCB MOV T.UCB(R2),R4 ;GET THE ASSOCIATED TI: FOR THE TASK CMPB #T$BLNM,(R3) ;IS THE TABLE NUMBER VALID BLO 50$ ;IF LO, NO, EXIT TSTB (R3) ;IS THIS A SYSTEM TABLE DELETE BNE 110$ ;IF NE, NO BIT #T3.PRV,T.ST3(R2); IS THE TASK PRIVILEGED TO DELETE SYSTEM LOG BEQ 60$ ;IF EQ, NO, EXIT WITH PRIVILEGE VIOLATION 110$: CMPB #LT.TSK,(R3) ;IS THIS A TASK TABLE DELETE BEQ 120$ ;IF EQ, YES, KEEP TCB IN DESCRIPTOR MOV R4,R2 ;GET UCB ADDRESS 120$: MOV R2,-(R5) ;MOVE TCB/UCB ADDRESS INTO DESCRIPTOR ; ; PICK UP THE APPROPRIATE TABLE NUMBER AND BLOCK IDENTIFIER FROM THE DPB ; MOVB (R3)+,(SP) ;MOVE THE TABLE NUMBER INTO STORAGE WITH MODE MOV (SP)+,-(R5) ;GET THE TABLE AND BLOCK NUMBER FROM STORAGE INC R3 ;POINT TO THE BUFFER ADDRESS IN THE DPB ; ; CHECK FOR A SPECIFIC LOGICAL DELETION OR AN ENTIRE TABLE BY LOOKING AT ; THE BUFFER ADDRESS FOR THE LOGICAL NAME ; TST (R3) ;CHECK FOR A SPECIFIC LOGICAL BNE 130$ ;IF NE, THERE IS ONE ; ; ALL LOGICALS ARE TO BE DELETED. LEAVE THE BUFFER DESCRIPTORS ZERO ; CLR -(R5) ;CLEAR THE LOGICAL SIZE CLR -(R5) ;CLEAR THE APR BIAS TO THE BUFFER CLR -(R5) ;CLEAR THE OFFSET TO THE STRING BR 140$ ;JOIN COMMON CODE ; ; A SPECIFIC LOGICAL IS GIVEN. VALIDATE THE USER BUFFER AND SIZE AND PLACE ; THEM IN THE DESCRIPTOR BLOCK. ; 130$: CALL ACRIB ;ADDRESS CHECK THE USER LOGICAL BUFFER CALL PSCNV ;CONVERT TO P/OS STYLE IF NECESSARY BCS 170$ ;IF CS, INVALID DEVICE MOV R2,-(R5) ;FILL IN APR6 OFFSET TO START OF LOGICAL MOV R1,-(R5) ;FILL IN APR BIAS OF BUFFER MOV R0,-(R5) ;FILL IN BYTE COUNT IN DESCRIPTOR ; ; CHECK THE DESCRIPTOR FOR COMPLETE OR SPECIFIC DELETE. IF SPECIFIC, THE ; LOGICAL MUST BE HASHED, SEARCHED FOR IN THE TABLE, AND THEN DELETED. ; IF THIS IS A COMPLETE DELETE, CALL $LNDAL TO ELIMINATE EVERYTHING IN THE ; HASH TABLE. ; 140$: MOV R5,R0 ;SET UP DESCRIPTOR ADDRESS FOR PROCESSING CALL $DELOG ;DELETE THE APPROPRIATE LOGICAL OR TABLE BCC 150$ ;IF CC, SUCCESSFUL COMPLETION TST R3 ;CHECK WHETHER NOT FOUND OR PRIVILEGE VIOLATION BNE 60$ ;IF NE, PRIVILEGE VIOLATION ON FOUND LNB BR 160$ ;IF EQ, LOGICAL NOT FOUND 150$: RETURN 160$: DRSTS D.RS21 ;LOGICAL NAME NOT FOUND 170$: DRSTS D.RS92 ;IE.IDU - INVALID DEVICE STATUS .DSABL LSB .PAGE .SBTTL $LNFTL - LOGICAL NAME TRANSLATION DIRECTIVE ;+ ; $LNFTL - ENTRY POINT FOR LOGICAL NAME DIRECTIVE TRANSLATION CODE ;- ; THIS DIRECTIVE SEARCHES EACH OF THE HIERARCHICAL TABLES FOR THE SPECIFIED ; LOGICAL UNLESS AN INHIBIT MASK BIT IS SET TO PREVENT THAT TABLE FROM BEING ; LOOKED AT. ; ; THE ROUTINE IS ENTERED FROM THE DRLOG DISPATCH AREA WITH R3 POINTING TO THE ; FOLLOWING DPB ENTRIES: ; ; WD. 01 -- SUBFUNCTION CODE (1),MODE ; WD. 02 -- TBMASK, STATUS ; WD. 03 -- ADDRESS OF LOGICAL NAME BUFFER ; WD. 04 -- SIZE OF LOGICAL NAME BUFFER ; WD. 05 -- ADDRESS OF EQUIVALENCE NAME BUFFER ; WD. 06 -- SIZE OF EQUIVALENCE NAME BUFFER ; WD. 07 -- ADDRESS OF WORD TO RECEIVE SIZE OF RETURNED EQUIV. NAME ; WD. 08 -- ADDRESS OF WORD TO RECEIVE TABLE NUMBER AND MODE ; ; THE FOLLOWING WORD IS NOT PRESENT IF THIS ROUTINE IS ENTERED VIA A TLOG$ ; DIRECTIVE FROM A P/OS SYSTEM. ; ; WD. 09 -- ADDRESS OF WORD TO RECEIVE STATUS FROM LOGICAL BLOCK ; $LNFTL:: .IF DF C$$RLG ; REMOTE LOGICAL SUPPORT BIT #F5.RLG,$FMSK5 ;ARE WE USING REMOTE LOGICAL? BNE 1$ ;IF NE YES JMP 11$ ;PERFORM NORMAL PROCESSING 1$: ; ; GET A REQUEST PACKET FROM CPRBUF ; MOV 6(R3),R1 ;GET SIZE OF LOGICAL NAME BEQ 2$ ;IF ZERO ERROR CMP R1,#LN$SIZ ;IS IT TOO LARGE? BLOS 3$ ;IF LO OR SAME NO 2$: DRSTS D.RS89 ;INVALID BUFFER SIZE 3$: CMP 12(R3),#LN$SIZ ;IS EQUIVALENCE STRING TOO BIG? BHI 2$ ;IF HI YES ADD 12(R3),R1 ;INCLUDE ENOUGH SPACE FOR EQUIV. STRING ; ; INCREASE ALLOCATION TO ALLOW FOR THE FOLLOWING; ; H$SIZE HEADER ; TL$SIZ DPB ; 10 TASK DESTINATION ADDRESSES; ; EQUIV STRING BUFFER ; RETURNED SIZE ; TABLE # & MODE ; LOGICAL STATUS BITS ; 6 RETURNED PARAMETERS ; RETURNED SIZE ; TABLE # & MODE ; LOGICAL STATUS BITS ; TMP = H$SIZE+TL$SIZ+10+6 ADD #TMP,R1 MOV R1,R4 ;SAVE SIZE OF REQUEST PACKET FOR CPSEN$ ADD #77,R1 ;ROUND R1 TO NEAREST 32. WORD BLOCK ASH #-6,R1 ; MOV #AL$BCK!AL$IMP,R0 ;BLOCK THE TASK, DO IMPLICIT START MOV R3,R5 ;SAVE DPB POINTER CALL $CPALO ;GET BUFFER FROM CPRBUF ; ; FILL IN REQUEST PACKET AND SEND TO CPRAME ; MOV R4,-(SP) ;SAVE SIZE OF REQUEST MOV R0,-(SP) ;SAVE PACKET BIAS MOV R0,KISAR6 ;MAP PACKET MOV #MAP6,R1 ;GET ADDRESS OF HEADER MOVB #HT$DIR,H$TYPE(R1) ;DIRECTIVE REQUEST CLRB H$ICNT(R1) ;NO ITEMS ; ; FILL IN DPB ; ADD #P$DPB,R1 ;POINT TO DPB AREA MOV -2(R5),(R1)+ ;COPY DIC AND SIZE MOV (R5),(R1)+ ;COPY SUBFUNCTION CODE AND MODIFIER MOV 2(R5),(R1)+ ;COPY TABLE MASK & STATUS MOV #TMP,(R1)+ ;ADDRESS OF LOGICAL NAME BUFFER MOV 6(R5),(R1)+ ;SIZE OF LOGICAL NAME BUFFER MOV #TMP,(R1) ;CALCULATE ADDRESS OF EQUIV STRING BUF ADD 6(R5),(R1)+ ;SKIP OVER LOGICAL NAME BUFFER MOV 12(R5),(R1)+ ;SIZE OF EQUIVALENCE STRING MOV #TMP-6,(R1)+ ;ADDRESS OF RETURNED SIZE BUFFER MOV #TMP-4,(R1)+ ;ADDRESS OF TABLE # & MODE BUFFER MOV #TMP-2,(R1)+ ;ADDRESS OF LOGICAL STATUS BITS BUFFER ; ; FILL IN TASK ADDRESSES (TO BE USED AFTER CPRAME COMPLETES FUNCTION) ; MOV 10(R5),(R1)+ ;STORE TASK ADDRESS OF EQUIV STRING BUF MOV 14(R5),(R1)+ ;STORE TASK ADDRESS OF RETURNED SIZE BUF MOV 16(R5),(R1)+ ;STORE TASK ADDRESS OF TABLE # & MODE MOV 20(R5),(R1) ;STORE TASK ADDRESS OF LOGICAL STATUS BITS ; ; COPY LOGICAL NAME INTO PACKET ; MOV 4(R5),R0 ;USER ADDRESS OF BUFFER MOV 6(R5),R1 ;SIZE OF BUFFER FOR ADDRESS CHECK CALL $ACHKB ;CHECK ADDRESS BCS 10$ ;IS CS ERROR CALL $RELOC ;GET SOURCE BIAS AND DISPLACEMENT ; ; R1 := BIAS ; R2 -> APR6 DISPLACEMENT ; SUB #MAP6-MAP5,R2 ;MAKE SOURCE DISPLACEMENT AN APR5 DISPLACEMENT MOV (SP),R3 ;GET DEST BIAS MOV #MAP6+TMP,R4 ;GET DEST DISPLACEMENT MOV 6(R5),R0 ;GET SIZE OF TRANSFER CALL $BLXIO ;TRANSFER LOGICAL NAME INTO BUFFER MOV (SP)+,R0 ;GET PACKET BIAS BACK MOV (SP)+,R4 ;GET PACKET LENGTH BACK CPSEN$ #SN$DIR,R0,R4 ;SEND REQUEST TO CPRAME ; ; GET RESPONSE PACKET ; MOV R0,-(SP) ;SAVE PACKET BIAS MOV R0,KISAR6 ;MAP PACKET CMP #IS.SUC,MAP6+H$STAT ;WAS SUCCESS RETURNED? BEQ 4$ ;IF EQ YES CMP #IE.RBS,MAP6+H$STAT ;WAS IT JUST A SIZE PROBLEM? BNE 5$ ;IF NE FATAL ERROR 4$: DPB = MAP6+P$DPB TASK = DPB+TL$SIZ TEMP = TASK+10 ; ; TRANSFER EQUIV STRING INTO TASK ; MOV TASK,R0 ;TASK ADDRESS OF EQUIV STRING MOV DPB+14,R1 ;SIZE OF BUFFER FROM DPB CALL $ACHKB ;DO ADDRESS CHECK BCS 9$ ;IF CS ERROR CALL $RELOC ;GET BIAS AND OFFSET OF BUFFER ; ; R1 := BIAS ; R2 -> APR6 DISPLACEMENT ; MOV R1,R3 ;SET UP DEST BIAS FOR BLXIO MOV R2,R4 ;SET UP DEST DISPLACEMENT MOV (SP),R1 ;SET UP SOURCE BIAS FOR APR5 MOV #MAP5+TMP,R2 ;SET UP SOURCE DISPLACEMENT ADD DPB+10,R2 ;SKIP OVER LOGICAL NAME BUF MOV TEMP,R0 ;GET RETURNED SIZE CALL $BLXIO ;RETURN EQUIVALENCE NAME STRING ; ; TRANSFER OTHER BUFFERS INTO TASK ; MOV #TASK+2,R3 ;ADDRESS OF OTHER BUFFERS MOV TEMP,R4 ;SIZE OF EQUIV STRING CALL 6$ ;MOVE TO TASK MOV TEMP+2,R4 ;TABLE # & MODE CALL 6$ ;MOVE TO TASK MOV TEMP+4,R4 ;LOGICAL STATUS BITS CALL 6$ ;MOVE TO TASK 5$: MOV (SP)+,R0 ;GET BUFFER BIAS BACK CALLR $CPDEA ;DEALLOCATE BUFFER ; ; ROUTINE TO VERIFY THE EXISTENCE OF AN OPTIONAL WORD, ADDRESS CHECK IT IF ; IT IS THERE, AND PLACE THE VALUE IN R4 IN THE LOCATION SPECIFIED IN THE ; NEXT WORD IN THE DPB (R3). ; 6$: MOV (R3)+,R0 ;SEE IF NEXT ENTRY IS DEFINED BEQ 8$ ;IF EQ, NO, EXIT MOV #7$,-(SP) ;SPECIFY $SGFIN RETURN ADDRESS CALL $SGFIN ;INHIBIT TRAPS MOV R4,-(SP) ;GET VALUE TO PLACE IN LOCATION MTPD (R0) ;PLACE VALUE INTO LOCATION RETURN ;RETURN FROM $SGFIN 7$: ;CARRY-BIT INDICATES STATUS [TBS] 8$: RETURN ; ; HANDLE ERRORS ; 9$: MOV (SP)+,R0 ;GET BUFFER BIAS BACK CALL $CPDEA ;DEALLOCATE BUFFER DRSTS D.RS98 ;ADDRESS CHECK ERROR 10$: MOV (SP)+,R0 ;GET PACKET BIAS TST (SP)+ ;CLEAN OFF STACK CALL $CPDEA ;DEALLOCATE BUFFER DRSTS D.RS98 ;ADDRESS ERROR 11$: .ENDC ; C$$RLG ; ; A DESCRIPTOR BLOCK IS SET UP TO PASS TO THE TABLE LOOKUP ROUTINES. THIS ; BLOCK GETS THE MODIFIER VALUE FROM THE DPB DIRECTLY. THE USER LOGICAL NAME ; BUFFER IS ADDRESS CHECKED (FOR READ-ONLY ACCESS) AND THE APR BIAS AND OFFSET ; TO THE START OF THE LOGICAL STRING IS PLACED IN THE DESCRIPTOR. THE SIZE OF ; THE INDICATED STRING IS ALSO PLACED IN THE BLOCK. R0 WILL POINT TO THIS ; BLOCK ACROSS ALL CALLS IN THIS DIRECTIVE. ; MOV #$TONYL,R5 ;GET POINTER TO DESCRIPTOR BLOCK MOV $TKTCB,-(R5) ;GET THE CURRENT TCB FOR FIRST LOOKUP MOV (R5),R0 ;SAVE THE TCB ADDRESS MOV (R3)+,-(R5) ;MOVE THE MODIFIER INTO DESCRIPTOR BLOCK MOV (R3)+,$TONYL ;STORE THE TABLE INHIBIT MASK FOR LATER USE BIT #1,$TONYL ;SEE IF TASK TABLE IS INHIBITED BEQ 12$ ;IF EQ, NO, KEEP TCB ADDRESS IN PACKET MOV T.UCB(R0),2(R5) ;MOVE THE UCB ADDRESS INTO THE PACKET ; ; ADDRESS CHECK THE USER LOGICAL NAME BUFFER ; 12$: CALL ACRIB ;ADDRESS CHECK THE USER LOGICAL NAME BUFFER CALL PSCNV ;CONVERT TO P/OS STYLE IF NECESSARY BCS 120$ ;IF CS, INVALID DEVICE MOV R3,-(SP) ;STORE THE CURRENT DPB POINTER FOR LATER MOV R2,-(R5) ;GET THE APR6 OFFSET TO START OF STRING MOV R1,-(R5) ;GET THE APR BIAS TO LOGICAL STRING MOV R0,-(R5) ;GET THE SIZE OF THE LOGICAL NAME IN DESCRIPTOR MOV R5,R0 ;POINT R0 TO DESCRIPTOR START ; ; CALL THE ROUTINE TO DO THE LOOKUP IN THE APPROPRIATE TABLES ; CMPB #R$LOG,$DICSV+2 ;IS THIS REALLY AN RLOG$ DIRECTIVE BEQ 20$ ;IF EQ, YES, SEARCH RECURSIVELY FOR LNB CMPB #R$LON,$DICSV+2 ;IS THIS REALLY AN RLOG$ DIRECTIVE BEQ 20$ ;IF EQ, YES, SEARCH RECURSIVELY FOR LNB ; ; FOR A TLOG$ DIRECTIVE, ONLY LOOK FOR THE SPECIFIED LOGICAL NAME IN THE ; TOP LEVELS OF THE LOGICAL NAME TABLES ; CALL $TBSRC ;SEARCH ALL HIERARCHICAL TABLES FOR LOGICAL BCS 100$ ;IF CS, NO LOGICAL NAME FOUND BR 40$ ;JOIN COMMON CODE BELOW ; ; FOR AN RLOG$ DIRECTIVE, LOOK THROUGH THE LOGICAL NAME TABLES RECURSIVELY ; FOR THE FINAL EQUIVALENCE NAME. ANY SPECIFIED INHIBIT MASK WILL BE ; PROPAGATED THROUGH ALL RECURSIVE LOOKUPS. ; 20$: CLR R3 ;CALL ITERATIVE ROUTINE IN EXACT MATCH MODE CALL $LGRCS ;RECURSIVELY LOOK FOR LOGICAL NAME BCS 100$ ;IF CS, RECURSIVE LIMIT WAS HIT MOV $LSTLG,R3 ;GET POINTER TO LNB BEQ 100$ ;IF EQ, THERE WASN'T ONE ; ; NOW THAT THE LOGICAL NAME HAS BEEN FOUND, THE APR BIAS TO THE LNB IS STORED ; FOR LATER USE AND THE USER EQUIVALENCE NAME BUFFER IS ADDRESSED CHECK FOR ; READ/WRITE ACCESS. IF IS VALID, THE SOURCE AND DESTINATION REGISTERS ARE ; SET UP FOR A $BLXIO CALL TO PLACE THE EQUIVALENCE NAME IN THE USER BUFFER. ; 40$: MOV R3,$TONYL ;STORE THE LNB APR BIAS FOR LATER USE MOV (SP)+,R3 ;RESTORE THE POINTER INTO THE DPB CALL ACROB ;ADDRESS CHECK RW THE USER EQUIVALENCE BUFFER MOV R3,-(SP) ;STORE THE POINTER TO THE DPB AGAIN MOV R1,R3 ;SET UP DESTINATION APR BIAS FOR $BLXIO MOV R2,R4 ;SET UP APR6 OFFSET VALUE FOR DESTINATION MOV $TONYL,KISAR6 ;MAP THE FOUND LNB ; ; THE NUMBER OF BYTES TO PASS THROUGH $BLXIO IS DETERMINED BY THE SIZE OF THE ; USER BUFFER. IF IT IS LARGE ENOUGH TO HOLD THE ENTIRE STRING, THE SIZE ; GIVEN IN THE LOGICAL BLOCK WILL BE PASSED. IF THE BUFFER ISN'T LARGE ENOUGH, ; ONLY AS MUCH AS IT CAN HOLD WILL BE PASSED. IN EITHER CASE, THE VALUE PASSED ; IN THE USER SIZE WORD (RSIZE) WILL BE THE ACTUAL SIZE OF THE EQUIVALENCE ; STRING ; CMPB MAP6+L.NENS,R0 ;SEE IF THE EQUIVALENCE SIZE IS > BUFFER SIZE BHIS 50$ ;IT IS, ONLY RETURN USER BUFFER SIZE WORTH CLR R0 ;REMOVE OLD VALUE BISB MAP6+L.NENS,R0 ;IT ISN'T, ONLY RETURN EQUIVALENCE SIZE 50$: CLR R2 ;INITIALIZE THE POINTER TO THE EQUIVALENCE BISB MAP6+L.NLNS,R2 ;STRING FOR $BLXIO ADD #MAP5+L.NNAM,R2 ; MOV KISAR6,R1 ;GET THE APR BIAS TO START OF SOURCE STRING ; ; INITIATE THE DATA MOVEMENT TO THE USER BUFFER ; CALL $BLXIO ;MOVE THE EQUIVALENCE STRING TO USER BUFFER ; ; THE REMAINDER OF THE WORK TO DO IS FILLING IN THE USER OPTIONAL WORDS FOR ; THE SIZE OF THE FOUND EQUIVALENCE STRING, THE TABLE NUMBER AND MOD OF THE ; FOUND LNB, AND THE STATUS BITS TAKEN FROM IT. IF A WORD IS NOT ; DEFINED, THAT PARTICULAR DATA WILL NOT BE PASSED BACK TO THE USER TASK. ; MOV (SP)+,R3 ;RESTORE THE DPB POINTER ; ; PASS BACK THE EQUIVALENCE NAME STRING SIZE ; CLR R4 ;GET VALUE FOR THE EQUIVALENCE NAME SIZE WORD BISB MAP6+L.NENS,R4 ; CALL 90$ ;PLACE IT IN THE USER WORD ; ; PASS BACK THE TABLE NUMBER AND MOD OF FOUND LOGICAL NAME ; MOV MAP6+L.NTBL,R4 ;GET VALUE FOR USER WORD FOR TABLE # AND MOD CALL 90$ ;PLACE IT IN THE USER WORD ; ; PASS BACK THE STATUS BITS FOUND FOR THE LOGICAL NAME. THIS OPERATION IS ; ELIMINATED IF THE DIRECTIVE WAS ISSUED FROM A P/OS SYSTEM. ; CMPB #P$SSIZ,$DICSV+1;IS THE DPB FROM A P/OS SYSTEM BEQ 95$ ;IF EQ, YES, SKIP THE STATUS WORD CHECK CLR R4 ;GET VALUE FOR THE STATUS WORD BISB MAP6+L.NSTS,R4 ; ;+ ; ROUTINE TO VERIFY THE EXISTENCE OF AN OPTIONAL WORD, ADDRESS CHECK IT IF ; IT IS THERE, AND PLACE THE VALUE IN R4 IN THE LOCATION SPECIFIED IN THE ; NEXT WORD IN THE DPB (R3). ;- 90$: MOV (R3)+,R0 ;SEE IF NEXT ENTRY IS DEFINED BEQ 95$ ;IF EQ, NO, EXIT MOV #2,R1 ;SET UP SIZE OF BUFFER TO VERIFY CALL $ACHCK ;ADDRESS CHECK THE BUFFER RW (WORD BOUNDARY) BCS 110$ ;IF CS, ADDRESS CHECK ERROR OCCURRED MOV R4,-(SP) ;GET VALUE TO PLACE IN LOCATION MTPD$ (R0) ;PLACE VALUE INTO LOCATION 95$: RETURN 100$: DRSTS D.RS21 ;LOGICAL NAME NOT FOUND 110$: DRSTS D.RS98 ;ADDRESS CHECK ERROR ON BUFFER 120$: DRSTS D.RS92 ;IE.IDU - INVALID DEVICE STATUS .PAGE ;+ ; $CRLOG - ROUTINE TO TAKE A PREVIOUSLY VERIFIED LOGICAL NAME CREATION BLOCK ; AND CREATE AND INSERT AN LNB INTO THE APPROPRIATE TABLE FOR THAT LOGICAL. ; ANY PREVIOUS LOGICAL WITH THE SAME NAME WILL BE DELETED AND SUPERCEDED. ; SUPERCESSION WILL BE INDICATED BY SETTING THE V BIT COMING OUT OF THE ; ROUTINE. ; ; INPUTS: ; R5 - POINTER TO THE DESCRIPTOR BLOCK CONTAINING DATA FOR LOGICAL CREATE ; WITH THE FORMAT: ; ; ----------------------------------------------- ; | BLOCK NUMBER | TABLE NUMBER | ; ----------------------------------------------- ; | GROUP NUMBER | STATUS BYTE | ; ----------------------------------------------- ; | TCB / UCB ADDRESS | ; ----------------------------------------------- ; | SIZE OF LOGICAL NAME IN BUFFER | ; ----------------------------------------------- ; | 32 WD APR ADDRESS OF START OF LOGICAL | ; ----------------------------------------------- ; | APR6 BIASED OFFSET TO START OF LOGICAL | ; ----------------------------------------------- ; | SIZE OF EQUIVALENCE NAME IN BUFFER | ; ----------------------------------------------- ; | 32 WD APR ADDRESS OF START OF EQUIVALENCE | ; ----------------------------------------------- ; | APR6 BIASED OFFSET TO START OF EQUIVALENCE| ; ----------------------------------------------- ; ; OUTPUTS: ; CC - LNB WAS SUCCESSFULLY CREATED ; R1 = 0 IF NO SUPERCESSION OF PREVIOUS ASSIGNMENT ; R1 <> 0 IF SUPERCESSION OF PREVIOUS ENTRY OCCURRED ; CS - A SECONDARY POOL ALLOCATION FAILURE OCCURRED ; ; R5 IS PRESERVED ACROSS THE CALL; HOWEVER THE DATA IN THE BLOCK IS NOT ; KISAR6 IS DESTROYED BY THIS ROUTINE ; ; CALLER MUST HAVE VALIDATED ALL ENTRIES IN THE DESCRIPTOR BLOCK BEFORE ; CALLING THIS ROUTINE. CALLER MUST ALSO HAVE VERIFIED THAT THE TASK IS ; PRIVILEGED IF THIS IS TO BE A SYSTEM TABLE CREATION. ; ; A ZERO VALUE IN THE BLOCK NUMBER VARIABLE HAS NO MEANING. THE LOWEST ; VALID NUMBER IS 1 (LB.LOC). IT WILL BE PLACED IN THE LNB BY DEFAULT ; IF A ZERO VALUE IS SEEN. THIS HELPS THE COMPATIBILITY ISSUE WITH POS ;- $CRLOG:: ; ; CHECK FOR A ZERO VALUE IN THE BLOCK PARAMETER. IF THERE IS ONE, TURN ; IT INTO A DEFAULT CREATION VALUE (LB.LOC). ; TSTB 1(R5) ;CHECK FOR A ZERO BLOCK VALUE BNE 5$ ;IF NE, SOMETHING ELSE WAS GIVEN MOVB #LB.LOC,1(R5) ;MOVE IN THE DEFAULT VALUE FOR CREATION ; ; CREATE THE LOGICAL NAME BLOCK AND FILL IN THE APPROPRIATE ENTRIES. ; 5$: MOVB (R5),R3 ;GET TABLE NUMBER FROM LNB CALL $TBTRL ;MAP THE HASH TABLE BCS 70$ ;IF CS, THERE WAS NO HASH TABLE MOV #L.NHSZ+77,R1 ;GET SIZE OF STATIC PIECE OF LNB ADD 6(R5),R1 ;ADD THE SIZE OF THE PROPOSED LOGICAL NAME ADD 14(R5),R1 ;ADD THE SIZE OF THE PROPOSED EQUIVALENCE NAME ASH #-6,R1 ;TURN BYTES INTO 32 WD BLOCKS CALL $ALSEC ;ALLOCATE A PIECE OF SECONDARY POOL FOR LNB BCS 70$ ;IF CS, ALLOCATION FAILED MOV R0,KISAR6 ;MAP THE NEW BLOCK MOV #MAP6+L.NTBL,R4 ;SET UP OFFSET VALUE FOR THE TABLE NUMBER MOV R5,-(SP) ;SAVE THE BUFFER POINTER ACROSS THE CALL MOV (R5)+,(R4)+ ;MOVE BLOCK AND TABLE NUMBER INTO LNB MOV (R5)+,(R4)+ ;MOVE STATUS AND GROUP NUMBER INTO LNB MOV (R5)+,(R4)+ ;MOVE TCB OR UCB ADDRESS INTO LNB MOV (R5)+,R0 ;GET SIZE OF LOGICAL NAME ; ; TRANSFER THE LOGICAL NAME STRING FROM THE USER BUFFER TO THE LNB ; MOV R0,(R4)+ ;MOVE IT INTO THE LNB MOV (R5)+,R1 ;GET APR BIAS OF LOGICAL NAME BUFFER MOV (R5)+,R2 ;GET OFFSET TO START OF LOGICAL NAME SUB #MAP6-MAP5,R2 ;TURN IT INTO AN APR5-BIASED OFFSET MOV KISAR6,R3 ;GET THE DESTINATION APR BIAS CALL $BLXIO ;TRANSFER THE LOGICAL NAME TO THE LNB ; ; TRANSFER THE EQUIVALENCE NAME STRING FROM THE USER BUFFER TO THE LNB ; MOV (R5)+,R0 ;GET THE SIZE OF THE EQUIVALENCE STRING MOVB R0,MAP6+L.NENS ;MOVE IN THE SIZE OF THE EQUIVALENCE NAME MOV (R5)+,R1 ;GET APR BIAS FOR EQUIVALENCE NAME BUFFER MOV (R5)+,R2 ;GET APR OFFSET SUB #MAP6-MAP5,R2 ;TURN IT INTO AN APR5 BIASED OFFSET CALL $BLXIO ;MOVE EQUIVALENCE NAME INTO LNB ; ; SET UP A MINIATURE DESCRIPTOR BLOCK TO PASS TO THE LOOKUP ROUTINES TO SEE ; IF THIS LOGICAL IS A SUPERCESSION OF A CURRENTLY EXISTING LOGICAL. THIS ; MINI DESCRIPTOR BLOCK IS POINTED TO BY R0 AND CONTAINS, IN ORDER - EACH TO ; A WORD, THE SIZE OF THE LOGICAL, THE MEMORY APR BIAS TO THE STRING BLOCK, ; THE APR6-BIASED OFFSET TO THE START OF THE LOGICAL, THE TABLE/BLOCK NUMBER, ; AND THE APPROPRIATE TCB/UCB. ; MOV R5,R0 ;GET POINTER TO MINI DESCRIPTOR SUB #14,R0 ; MOV -6(R0),6(R0) ;MOVE TABLE NUMBER AND BLOCK NUMBER MOV -2(R0),10(R0) ;MOVE TCB/UCB ADDRESS ; ; NOW UPPER CASE ALL ALPHABETIC CHARACTERS IN THE LOGICAL NAME ; MOV #MAP6+L.NNAM,R3 ;GET POINTER TO THE START OF THE STRING CLR R2 ;GET THE NUMBER OF CHARACTERS TO PROCESS BISB MAP6+L.NLNS,R2 ; 10$: CALL $CVBUC ;UPPER CASE THE CHARACTER IF NECESSARY MOVB R5,-1(R3) ;MOVE THE VALUE BACK INTO THE LNB SOB R2,10$ ;GO BACK IF MORE TO PROCESS ; ; SEARCH THE APPROPRIATE TABLE FOR A CURRENTLY EXISTING LNB WITH THE SAME NAME. ; IF FOUND, DELETE THAT ENTRY, ENTER THE NEW ONE, AND EXIT WITH A STATUS OF ; LOGICAL SUPERCEDED. ; CALL $LNHSH ;HASH THE ENTRY CLR -(SP) ;INITIALIZE SUPERCESSION INDICATOR MOV KISAR6,-(SP) ;STORE THE LNB ADDRESS ACROSS THE LOOKUPS CALL $LNTBS ;SEARCH THE TABLES FOR THE LOGICAL NAME BCS 20$ ;IF CS, A PREVIOUS ENTRY WAS NOT FOUND ; ; A LOGICAL WAS FOUND IN THE TABLE. FLAG THE SUPERCESSION BY MAKING R1 ; NONZERO AND REMOVE THE OLD ENTRY ; MOV R3,2(SP) ;MOVE IN THE OLD ENTRY ADDRESS CALL $LNELM ;REMOVE THE OLD LNB ; ; INSERT THE NEW ENTRY INTO THE TABLES ; 20$: MOV (SP)+,R0 ;RESTORE THE NEW LNB ADDRESS ; ; AT THIS POINT: ; R0 - 32 WD ADDRESS OF NEW LNB TO BE INSERTED INTO POSITION ; R1 - HASH TABLE WORD OFFSET ; R3 - 32 WD ADDRESS OF LNB TO BE BEHIND THE LNB TO BE INSERTED ; R4 - 32 WD ADDRESS OF LNB TO BE AHEAD OF NEW LNB IN LIST (=0 IF NONE) ; ; OUTPUTS: ; CC = 0 -> LNB IS INSERTED INTO LIST AND ALL LINKAGES ARE UPDATED ; CC = 1 -> INSERTION FAILED FROM INVALID HASH TABLE ADDRESS ; MOV R0,KISAR6 ;MAP THE NEW LNB MOV R3,MAP6+L.NLNK ;SET THE LINKAGES FOR THE LNB BEHIND THE NEW MOVB MAP6+L.NTBL,R3 ;GET THE TABLE NUMBER FOR THIS ENTRY MOV R4,KISAR6 ;MAP THE PREVIOUS LNB BNE 30$ ;IF NE, THERE IS ONE CALL $TBTRL ;MAP THE HASH TABLE BCS 50$ ;IF CS, THERE WASN'T ONE ADD #MAP6,R1 ;SET POINTER TO HASH CELL MOV R0,(R1) ;PUT IN FIRST ENTRY BR 40$ ; 30$: MOV R0,MAP6+L.NLNK ;INSERT POINTER TO NEW LNB 40$: CLC ;INDICATE SUCCESS 50$: MOV (SP)+,R1 ;RESTORE THE SUPERCESSION FLAG MOV (SP)+,R5 ;RESTORE THE DESCRIPTOR BLOCK ADDRESS 70$: RETURN .PAGE ;+ ; $DELOG - ROUTINE TO DELETE AN EXPLICIT LOGICAL NAME OR A COMPLETE TABLE ; ; INPUTS: ; R0 - POINTER TO A DESCRIPTOR BLOCK DESCRIBING LOGICAL TO BE DELETED ; WITH THE FORMAT: ; WD 1 - BYTE COUNT OF LOGICAL NAME ; WD 2 - 32 WD BLOCK ADDRESS OF LOGICAL NAME ; WD 3 - APR BIASED OFFSET TO START OF LOGICAL NAME ; WD 4 - TABLE # TO BE SEARCHED (LOW BYTE) ; BLOCK TYPE NUMBER (HIGH BYTE) ; WD 5 - MATCHING TCB OR UCB DEPENDING ON TYPE OF TABLE ; ; IF AN ENTIRE TABLE IS TO BE DELETED, THE FIRST 3 WORDS OF THE DESCRIPTOR ; BLOCK ARE ZERO. ; ; OUTPUTS: ; ; CC - SUCCESSFUL DELETION OF LOGICAL ; CS : R3 = 0 -> LOGICAL NOT FOUND IF SPECIFIC LOGICAL REQUESTED ; R3 <> 0 -> PRIVILEGE VIOLATION IF SPECIFIC LOGICAL REQUESTED ;- $DELOG:: TSTB 7(R0) ;CHECK FOR ZERO BLOCK MODIFIER BNE 10$ ;IF NE, THERE ISN'T ONE MOVB #LB.LOC,7(R0) ;A ZERO MODIFIER IMPLIES LOCAL MODE DEFAULT 10$: TST (R0) ;SEE IF THIS IS A SPECIFIC DELETE BNE 20$ ;IF EQ, IT ISN'T, DELETE ALL MATCHING LOGICALS ; ; TOTAL LOGICAL DELETE ; CALLR $LNDAL ;ELIMINATE ALL LOGICALS AND EXIT ; ; SPECIFIC LOGICAL DELETE ; 20$: CALL $LNHSH ;IT IS SPECIFIC, HASH NAME CALL $LNTBS ;FIND THE NAME IN THE SPECIFIED TABLE BCC 40$ ;IF CC, FOUND LNB, CHECK PRIVILEGE CLR R3 ;INDICATE NO LOGICAL FOUND SEC ;INDICATE FAILURE 30$: RETURN 40$: MOV R3,KISAR6 ;MAP THE LNB FOUND WITH MATCH CALL PRVTST ;CHECK TASK PRIVILEGE AGAINST LNB BCS 30$ ;IF CS, TASK CANNOT ELIMINATE LOGICAL .PAGE ;+ ; $LNELM - ROUTINE TO ELMINATE AN ALREADY FOUND LNB ; ; INPUTS: ; R0 - POINTER TO LOGICAL NAME DESCRIPTOR BLOCK ; BLOCK CONTAINS: ; WD 1 - BYTE COUNT OF LOGICAL NAME ; WD 2 - 32 WD BLOCK ADDRESS OF LOGICAL NAME ; WD 3 - APR BIASED OFFSET TO START OF LOGICAL NAME ; WD 4 - TABLE # TO BE SEARCHED (LOW BYTE) ; BLOCK TYPE NUMBER (HIGH BYTE) ; WD 5 - MATCHING TCB OR UCB DEPENDING ON TYPE OF TABLE ; R1 - WORD OFFSET FROM START OF HASH TABLE TO CORRECT HASH CELL ; R3 - 32 WD BLOCK ADDRESS OF LNB TO BE ELMINATED ; R4 - PREVIOUS LNB 32 WD ADDRESS IN LIST (=0 IF NONE BEFORE) ; ; OUTPUT: ; ; CC = 0 ; R3 - 32 WD BLOCK ADDRESS OF LNB AFTER THE ONE ELMINATED (0 IF NONE) ; R4 - PREVIOUS LNB 32 WD ADDRESS IN LIST (=0 IF NONE BEFORE) ; ; CC = 1 ; R3 AND R4 ARE THE SAME AS INPUT ;+ $LNELM:: MOV R4,-(SP) ;SAVE THE PREVIOUS ENTRY ACROSS CALL MOV R1,-(SP) ;SAVE THE HASH OFFSET ACROSS CALL MOV R3,-(SP) ;SAVE THE LNB ADDRESS TO BE ELIMINATED MOV R3,KISAR6 ;MAP THE LNB MOV MAP6+L.NLNK,R3 ;GET THE FORWARD LINK IN THE CURRENT LNB MOV R4,KISAR6 ;MAP THE PREVIOUS LNB BNE 20$ ;IF NE, THERE IS ONE CALL $MPHSH ;MAP THE HASH TABLE BCC 10$ ;CC -> SUCCESS MOV (SP)+,R3 ;RESTORE R3 BR 40$ ;RESTORE THE REST OF THE REGISTERS AND EXIT 10$: ADD #MAP6,R1 ;GET ADDRESS OF CELL MOV R3,(R1) ;RESET THE FORWARD LINKAGES BR 30$ ; 20$: MOV R3,MAP6+L.NLNK ;RESET THE LINKAGES IF THERE IS A PREVIOUS LNB 30$: MOV (SP)+,R0 ;RESTORE POINTER TO LNB TO BE ELIMINATED MOV R0,KISAR6 ;MAP IT IN KERNEL APR 6 MOV MAP6+L.NLNS,R1 ;GET THE LENGTH OF THE LOGICAL NAME IN THE LNB MOVB R1,R2 ;SCREEN OUT THE VARIOUS VALUES AND ADD BIC #177400,R2 ;GET LOGICAL NAME SIZE SWAB R1 ;PUT EQUIVALENCE NAME IN LOW BYTE OF R1 BIC #177400,R1 ;GET LOGICAL NAME SIZE ADD R2,R1 ;GET FULL SIZE OF BOTH BUFFERS ADD #L.NHSZ+77,R1 ;GET FULL SIZE OF LNB IN BYTES ASH #-6,R1 ;TURN BYTES INTO BLOCKS CALL $DESEC ;DEALLOCATE THE PREVIOUS LNB CLC ;INDICATE SUCCESS 40$: MOV (SP)+,R1 ;RESTORE THE HASH CELL OFFSET MOV (SP)+,R4 ;RESTORE THE PREVIOUS ENTRY RETURN .PAGE ;+ ; -- $LNTDR -- TRANSLATE RSX DEVICE FORM RECURSIVELY ; -- $LNTSL -- TRANSLATE RSX DEVICE FORM RECURSIVELY WITH SPECIFIC INHIBIT ; MASK AND MODIFIER VALUE ; ; THIS ROUTINE WILL RECURSIVELY SEARCH THE LOGICAL NAME TABLES FOR DEVICE NAME. ; THE DEVICE MNEMONIC AND UNIT NUMBER ARE MERGED INTO AN INTERNAL STRING TO ; USE AS THE BASE LOGICAL FOR THE LOOKUPS. AS A LOGICAL IS FOUND FOR EACH ; LEVEL, IT IS CHECKED TO SEE IF IT IS TERMINAL. IF SO, LOOKUPS CEASE, ; OTHERWISE A NEW SET OF LOOKUPS ARE PERFORMED FOR THE LATEST LOGICAL. ONCE ; THE BOTTOM LEVEL LOGICAL IS FOUND, THE DEVICE MNEMONIC AND UNIT NUMBER (IN ; BINARY) ARE RESTORED TO R2 AND R0 RESPECTIVELY. ; ; $LNTSL IS IDENTICAL TO $LNTDR WITH THE ADDITION OF AN EXPLICIT MODIFIER ; VALUE THAT MUST MATCH THE VALUE IN THE LNB AND AN INHIBIT MASKWORD THAT ; INDICATES THE LOGICAL TABLES THAT CANNOT BE SEARCHED. THIS MASKWORD IS ; IN EFFECT IN ALL LOOKUP LEVELS AND TABLES. ; ; INPUTS: ; ; R0 = THE BINARY UNIT NUMBER OF THE DEVICE SPEC ; R2 = THE ASCII MNEMONIC OF THE DEVICE SPEC ; $LNTSL SPECIFIC PARAMETERS: ; R3 = SPECIFIC MODIFIER VALUE TO MATCH IN LNB ; $TONYL = SPECIFIC INHIBIT MASKWORD USED ACROSS ALL LOOKUPS ; ; OUTPUTS: ; C=0, ; ; R0 = THE BINARY UNIT NUMBER OF THE RESULTANT DEVICE SPEC ; R2 = THE ASCII DEVICE MNEMONIC OF THE RESULTANT DEV. SPEC. ; R3 = APR BIAS OF MATCHING LNB SECONDARY POOL BLOCK ; ; C=1 INVALID TRANSLATION ON EXISTING LOGICAL ; ; R3 = 0 IF NO MATCH WAS FOUND FOR DEVICE NAME ; = N IF A MATCH WAS FOUND BUT DID NOT TRANSLATE TO DEVICE ; OR RECURSION LIMIT WAS HIT ; ; IF AN ERROR CONDITION OCCURS (VS, CS) R0 AND R2 ARE PRESERVED ACROSS THE ; CALL. R1,R3 ARE DESTROYED BY THIS ROUTINE. R4,R5,KISAR6 ARE PRESERVED. ; ;- $LNTDR:: CLR R3 ;INITIALIZE THE MODIFIER VALUE CLR $TONYL ;INITIALIZE THE INHIBIT MASK WORD $LNTSL::SAVNR ;SAVE R4 AND R5 MOV KISAR6,-(SP) ;SAVE THE OLD DATA MAPPING APR MOV R0,-(SP) ;SAVE THE UNIT NUMBER MOV R2,-(SP) ;SAVE THE DEVICE MNEMONIC MOV R3,-(SP) ;SAVE THE MODIFIER VALUE TO BE USED ; ; MOVE THE DEVICE NAME MNEMONIC AND ASCIIZED UNIT NUMBER INTO A SCRATCH BUFFER ; FOR THE INITIAL LOOKUP IN THE TABLES. ; MOV #$LTBUF,R3 ;POINT TO SCRATCH BUFFER TO BUILD DEVICE STRING MOV R2,(R3)+ ;MOVE IN THE ASCII DEVICE MNEMONIC CALL $DCBTA ;TURN THE OCTAL UNIT NUMBER TO ASCII IN BUFFER ; ; INITIALIZE THE INTERNAL LOGICAL NAME DESCRIPTOR BLOCK TO BE PASSED AROUND ; DURING THE VARIOUS LOOKUPS. ; SUB #$LTBUF,R3 ;GET THE STRING LENGTH IN R3 MOV #$TONYL,R0 ;CREATE THE LOGICAL NAME DESCRIPTOR BLOCK MOV $TKTCB,R2 ;GET THE CURRENT TCB ADDRESS BIT #1,(R0) ;IS THE TASK TABLE INHIBITED BEQ 5$ ;IF EQ, NO, KEEP TCB ADDRESS MOV T.UCB(R2),R2 ;GET THE UCB ADDRESS INSTEAD 5$: MOV R2,-(R0) ;MOVE IN THE APPROPRIATE ADDRESS CLR -(R0) ;CLEAR THE TABLE AND BLOCK NUMBER BISB (SP)+,1(R0) ;GET AN EXPLICIT MODIFIER VALUE IF IS ONE MOV #$LTBUF+20000,-(R0) ;MOVE APR6 BIASED ADDRESS INTO BLOCK MOV KISAR5,-(R0) ;TURN THE ADDRESS INTO APR BIAS AND OFFSET MOV R3,-(R0) ;MOVE THE LENGTH OF THE STRING INTO DESCRIPTOR ; ; ENTER A LOOP OF LOOKUPS FOR EACH NEWLY FOUND LOGICAL IN THE CHAIN. ; A POINTER TO THE LATEST FOUND LNB IS KEPT FOR USE AFTER ALL LOOKUPS ARE ; COMPLETED. LOOKUPS TERMINATE AS SOON AS A LOGICAL ISN'T FOUND, OR IF ; THE LATEST HAS THE TERMINAL ATTRIBUTE OR BEGINS WITH AN _. THIS LOOP ; WILL BE EXECUTED A MAXIMUM OF M$XLOG TIMES BEFORE AN ERROR IS RETURNED. ; THIS IS TO PREVENT AN INFINITE LOOP IN ASSIGNMENTS AND ALSO TO PUT SOME ; KIND OF RESTRICTION ON USAGE OF SYSTEM STATE LOOKUP TIME. ; ; A NONZERO VALUE IN R3 INDICATES THAT THE LOGICAL LOOKUP IS TO BE DONE ; IN FILES-11 MODE - THIS MEANS THAT THE SUBSEQUENT EQUIVALENCE NAME IS ; SEARCHED UP TO, BUT NOT INCLUDING, THE COLON. IF ONE IS NOT FOUND, ; THE ENTIRE STRING IS USED FOR THE NEXT ROUND. OTHERWISE, EVERYTHING ; BEFORE THE COLON IS USED. ; CALL $LGRCS ;LOOK UP THE DEVICE LOGICAL RECURSIVELY BCS 10$ ;IF CS, RECURSION LIMIT FAILURE OCCURRED ; ; NOW THAT THE CHAIN HAS BEEN WALKED DOWN COMPLETELY, RESTORE THE LAST LNB ; FOUND AND PARTIALLY VERIFY THAT THE EQUIVALENCE NAME IS A VALID PHYSICAL ; DEVICE NAME. IF IT IS, R0 AND R2 ARE RESTORED WITH THE DEVICE MNEMONIC ; AND BINARY UNIT NUMBER. ; CALL DVVFY ;VALIDATE THE RESULTING LOGICAL AS A DEVICE BCS 10$ ;IF CS, THE LOGICAL WAS INVALID CMP (SP)+,(SP)+ ;ELIMINATE THE OLD VALUES FOR R0 AND R2 BR 20$ ;EXIT SUCCESSFULLY 10$: MOV (SP)+,R2 ;RESTORE THE OLD DEVICE MNEMONIC MOV (SP)+,R0 ;RESTORE THE OLD UNIT NUMBER SEC 20$: MOV (SP)+,KISAR6 ;RESTORE ANY OLD MAPPINGS MOV $LSTLG,R3 ;SET INDICATION OF WHETHER A MATCH OCCURRED RETURN ;+ ; -- $RTRL1 -- TRANSLATE LOGICAL RECURSIVELY ; ; THIS ROUTINE WILL RECURSIVELY SEARCH THE LOGICAL NAME TABLES FOR A LOGICAL ; AS A LOGICAL IS FOUND AT EACH LEVEL, IT IS CHECKED TO SEE IF IT IS TERMINAL. ; IF SO, LOOKUPS CEASE, OTHERWISE A NEW SET OF LOOKUPS ARE PERFORMED FOR THE ; LATEST LOGICAL. ONCE THE BOTTOM LEVEL LOGICAL IS FOUND, THE DEVICE MNEMONIC ; AND UNIT NUMBER (IN BINARY) ARE RESTORED TO R2 AND R0 RESPECTIVELY. ; ; INPUTS: ; ; R0 = POINTER TO A USER BUFFER ADDRESS CONTAINING LOGICAL ; R2 = SIZE OF LOGICAL IN BUFFER ; ; OUTPUTS: ; C=0, ; ; R0 = THE BINARY UNIT NUMBER OF THE RESULTANT DEVICE SPEC ; R2 = THE ASCII DEVICE MNEMONIC OF THE RESULTANT DEV. SPEC. ; R3 = APR BIAS OF MATCHING LNB SECONDARY POOL BLOCK ; ; C=1 INVALID TRANSLATION ON EXISTING LOGICAL ; ; R3 = 0 IF NO MATCH WAS FOUND FOR DEVICE NAME ; = N IF A MATCH WAS FOUND BUT DID NOT TRANSLATE TO DEVICE ; OR RECURSION LIMIT WAS HIT ; ; IF AN ERROR CONDITION OCCURS (VS, CS) R0 AND R2 ARE PRESERVED ACROSS THE ; CALL. R1,R3 ARE DESTROYED BY THIS ROUTINE. R4,R5,KISAR6 ARE PRESERVED. ; ;- $RTRL1:: SAVNR ;SAVE R4 AND R5 MOV KISAR6,-(SP) ;STORE THE PREVIOUS KERNEL DATA 6 MAPPING MOV R2,-(SP) ;SAVE LOGICAL SIZE FOR LATER USE ; ; CREATE THE LOGICAL DESCRIPTOR BLOCK FOR USE ACROSS THE RECURSIVE CALLS ; MOV #$TONYL,R3 ;POINT TO BOTTOM OF THE DESCRIPTOR MOV $TKTCB,-(R3) ;PUT IN THE TCB ADDRESS FOR CURRENT TASK CLR -(R3) ;CLEAR THE TABLE AND MODE NUMBERS CLR $TONYL ;INDICATE ROUTINE SHOULD SEARCH ALL TABLES CALL $RELOC ;TURN USER BUFFER ADDRESS INTO OFFSET AND APR MOV R2,-(R3) ;MOVE THE OFFSET INTO THE DESCRIPTOR MOV R1,-(R3) ;MOVE THE APR6 OFFSET INTO THE DESCRIPTOR MOV (SP)+,-(R3) ;GET THE LOGICAL SIZE MOV R3,R0 ;POINT R0 AT THE DESCRIPTOR ; AND INDICATES FILES-11 MODE OF $LGRCS ; ; ENTER A LOOP OF LOOKUPS FOR EACH NEWLY FOUND LOGICAL IN THE CHAIN. ; A POINTER TO THE LATEST FOUND LNB IS KEPT FOR USE AFTER ALL LOOKUPS ARE ; COMPLETED. LOOKUPS TERMINATE AS SOON AS A LOGICAL ISN'T FOUND, OR IF ; THE LATEST HAS THE TERMINAL ATTRIBUTE OR BEGINS WITH AN _. THIS LOOP ; WILL BE EXECUTED A MAXIMUM OF M$XLOG TIMES BEFORE AN ERROR IS RETURNED. ; THIS IS TO PREVENT AN INFINITE LOOP IN ASSIGNMENTS AND ALSO TO PUT SOME ; KIND OF RESTRICTION ON USAGE OF SYSTEM STATE LOOKUP TIME. ; CALL $LGRCS ;LOOK UP THE DEVICE LOGICAL RECURSIVELY BCS 10$ ;IF CS, RECURSION LIMIT FAILURE OCCURRED ; ; NOW THAT THE CHAIN HAS BEEN WALKED DOWN COMPLETELY, RESTORE THE LAST LNB ; FOUND AND PARTIALLY VERIFY THAT THE EQUIVALENCE NAME IS A VALID PHYSICAL ; DEVICE NAME. IF IT IS, R0 AND R2 ARE RESTORED WITH THE DEVICE MNEMONIC ; AND BINARY UNIT NUMBER. ; CALL DVVFY ;VALIDATE THE RESULTING LOGICAL AS A DEVICE 10$: MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPING AND KEEP CARRY RETURN ;+ ; $LGRCS - ROUTINE TO SCAN THE LOGICAL TABLES RECURSIVELY ; ; INPUTS: ; R0 - POINTER TO DESCRIPTOR BLOCK OF FIRST LOGICAL IN CHAIN ; $TONYL - TABLE INHIBIT MASK WORD ; R3 - FILES-11 MODE PROCESSING FLAG (>0 -> YES) ; ; OUTPUTS: ; CC - SEARCH MAY OR MAY NOT HAVE RESULTED IN AN LNB MATCH ; $LSTLG - SECONDARY POOL ADDRESS OF FINAL LNB (=0 IF NO MATCH) ; CS - RECURSION LIMIT WAS HIT (DEFINED BY M$XLOG) ; ; ENTER A LOOP OF LOOKUPS FOR EACH NEWLY FOUND LOGICAL IN THE CHAIN. ; ; NOT PRESERVED: KISAR6, R3 ; A POINTER TO THE LATEST FOUND LNB IS KEPT FOR USE AFTER ALL LOOKUPS ARE ; COMPLETED. LOOKUPS TERMINATE AS SOON AS A LOGICAL ISN'T FOUND, OR IF ; THE LATEST HAS THE TERMINAL ATTRIBUTE OR BEGINS WITH AN _. THIS LOOP ; WILL BE EXECUTED A MAXIMUM OF M$XLOG TIMES BEFORE AN ERROR IS RETURNED. ; THIS IS TO PREVENT AN INFINITE LOOP IN ASSIGNMENTS AND ALSO TO PUT SOME ; KIND OF RESTRICTION ON USAGE OF SYSTEM STATE LOOKUP TIME. ; ; IN FILES-11 PROCESSING MODE, THIS ROUTINE WILL SEARCH FOR A COLON IN ; THE LOGICAL AND ONLY USE THE BEFORE IT. THIS HAPPENS IN ALL PASSES. ; IF NO COLON IS FOUND, THE ENTIRE STRING IS USED IN EACH CASE. ;- $LGRCS:: MOV R3,-(SP) ;SAVE THE MODE PROCESSING FLAG CLR $LSTLG ;CLEAR THE ULTIMATE LNB POINTER MOV #M$XLOG,-(SP) ;PUT THE MAXIMUM RECURSION LIMIT ON THE STACK 10$: DEC (SP) ;SEE IF ANOTHER ROUND IS ALLOWED BGE 13$ ;IF LT, NO, RECURSION ERROR HAS OCCURRED SEC ;INDICATE FAILURE FROM RECURSION LIMIT MOV (SP)+,(SP)+ ;MAXIMUM RECURSION LIMIT, MAINTAIN CARRY SET BR 40$ ;RETURN WITH RECURSION ERROR 13$: TST 2(SP) ;IS THIS FILES-11 PROCESSING MODE BEQ 15$ ;IF EQ, NO, USE EXACT MATCH ALWAYS CALL LGTSET ;YES, DO COLON SEARCH AND RESET DESCRIPTOR 15$: CALL $TBSRC ;LOOK FOR LOGICAL IN ALL APPROPRIATE TABLES BCS 30$ ;IF CS, LOGICAL NOT FOUND MOV R3,$LSTLG ;SAVE THE CURRENT LINK FOR LATER USE MOV R3,KISAR6 ;MAP THE LNB TO RESET THE DESCRIPTOR BLOCK BIT #LS.TRM,MAP6+L.NSTS ;IS THIS LNB TERMINAL? BNE 30$ ;IF NE, YES, STOP LOOKUPS CLR R2 ;INITIALIZE POINTER TO START OF EQUIVALENCE STR BISB MAP6+L.NLNS,R2 ;GET THE LENGTH OF THE LOGICAL NAME ADD #MAP6+L.NNAM,R2 ;POINT TO THE START OF THE ENS CMPB #'_,(R2) ;IS THIS TERMINAL IN THE OLD WAY? BEQ 30$ ;IF EQ, YES, STOP LOOKUPS 20$: CLR (R0) ;INITIALIZE THE NEW LENGTH IN THE DESCRIPTOR BISB MAP6+L.NENS,(R0);GET THE NEW LENGTH MOV R2,4(R0) ;MOVE THE NEW OFFSET INTO DESCRIPTOR MOV R3,2(R0) ;MOVE IN THE NEW APR BIAS AS WELL BIT #1,$TONYL ;SEE IF THE TASK TABLE IS INHIBITED BNE 10$ ;IF NE, IT IS, SKIP TCB RECOVERY MOV $TKTCB,10(R0) ;RESTORE THE TCB POINTER FOR NEXT LOOKUP SET BR 10$ ;GO BACK FOR ANOTHER LOOP 30$: CLR (SP)+ ;CLEAR THE RECURSION LIMIT VALUE OFF THE STACK CLR (SP)+ ; AND CLEAR CARRY 40$: RETURN .ENABL LSB ;+ ; DVVFY - ROUTINE TO VERIFY THAT THE LOGICAL DESCRIBED BY $LSTLG IS A VALID ; FORM OF AN RSX PHYSICAL DEVICE. ONLY THE FORMAT OF THE LOGICAL IS ; VERIFIED - ACTUAL EXISTENCE OF THE DEVICE IS IRRELEVANT ; ; INPUTS: ; $LSTLG - CONTAINS SECONDARY POOL ADDRESS OF LNB TO VERIFY ; OUTPUTS: ; CC - LOGICAL IN $LSTLG SUCCESSFUL PASSED FORM TEST OF RSX DEVICE ; CS - NO LOGICAL IN $LSTLG OR LOGICAL FAILED FORM TEST ; ; R0,R1,R2,R3,R5 ARE DESTROYED BY THIS ROUTINE ; ; THIS CODE WILL IGNORE ANY LEADING TERMINAL CHARACTERS (_) IN THE EQUIVALENCE ; STRING BEFORE BEGINNING THE VERIFICATION. ;- DVVFY: MOV $LSTLG,KISAR6 ;MAP THE ULTIMATE LNB BEQ 50$ ;IF EQ, ONE WAS NOT FOUND, INDICATE FAILURE CLR R5 ;INITIALIZE A STRING LENGTH VALUE BISB MAP6+L.NENS,R5 ;GET THE LENGTH TO VERIFY MOVB MAP6+L.NLNS,R1 ;POINT R1 TO THE START OF THE STRING ADD #MAP6+L.NNAM,R1 ;POINT TO START OF EQUIVALENCE STRING 5$: CMPB #'_,(R1)+ ;CHECK FOR LEADING FINAL INDICATORS BNE 10$ ;IF NE, NO MORE THERE DEC R5 ;DECREMENT THE REMAINING NUMBER TO CHECK BEQ 50$ ;IF EQ, INVALID DEVICE BR 5$ ;GO BACK FOR ANOTHER TO CHECK 10$: DEC R1 ;BACK UP TO INCLUDE DELIMITER DEVCHK: CLR R0 ;INITIALIZE THE UNIT NUMBER MOVB (R1)+,R2 ;GET FIRST CHARACTER IN MNEMONIC DEC R5 ;SEE IF THIS IS THE LAST CHARACTER BEQ 50$ ;IF EQ, YES, INVALID DEVICE CALL CHRCHK ;IS THIS CHARACTER ALPHANUMERIC BCS 50$ ;IF CS, ERROR IN THE NAME SWAB R2 ;GET SECOND HALF OF THE TASKNAME CLRB R2 ; BISB (R1)+,R2 ; CALL CHRCHK ;IS IT VALID BCS 50$ ;IF CS, IT WAS BAD SWAB R2 ;REVERSE THE LETTERS BACK TO CORRECT POSITION DEC R5 ;IS IS A ZERO VALUE BNE 30$ ;IF NE, THERE IS MORE ON THE STRING TO CHECK 20$: CLC ;INDICATE SUCCESS BR 60$ ;EXIT ; ; VALIDATE THAT THE REST OF THE STRING IS A VALID OCTAL NUMBER OR A TRAILING ; COLON. ; 30$: MOVB (R1)+,R3 ;GET THE FIRST CHARACTER OF UNIT NUMBER CMPB R3,#'0 ;IS THIS A VALID NUMERIC CHARACTER BLO 40$ ;IF LO, NO CMPB R3,#'7 ;IS IT STILL VALID ON THE HIGH SIDE? BHI 40$ ;IF HI, NO SUB #60,R3 ;TURN THE NUMBER INTO A BINARY VALUE ASH #3,R0 ;MULTIPLY EVERYTHING UP TO NOW BY 8 ADD R3,R0 ;ADD IN THE NEW NUMBER DEC R5 ;ANY MORE CHARACTERS TO PROCESS? BNE 30$ ;IF NE, YES CMP #377,R0 ;IS THIS A VALID NUMBER BHI 20$ ;IF LO, DEFINITELY NOT BR 50$ ;INDICATE ERROR 40$: CMPB R3,#': ;SEE IF THIS IS A COLON BEQ 20$ ;IF EQ, IT IS, VALID STRING FOUND 50$: SEC 60$: RETURN .DSABL LSB ;+ ; CHRCHK - ROUTINE TO VALIDATE THE ALPHA STATE OF THE DEVICE MNEMONIC ; ; INPUTS: ; R2 - CHARACTER TO BE VERIFIED ;- CHRCHK: BICB #40,R2 ;CONVERT CHARACTER TO UPPERCASE CMPB #'A,R2 ;IS THIS BELOW THE SET BHI 10$ ;IF HI, YES CMPB #'Z,R2 ;IS THIS ABOVE THE SET BLO 10$ ;IF LO, YES CLC ;INDICATE SUCCESS BR 20$ ;EXIT 10$: SEC ;INDICATE FAILURE 20$: RETURN ; ;+ ; PSCNV - ROUTINE TO TRANSLATE THE LOGICAL NAME SPECIFIED IN ONE OF THE ; P/OS COMPATIBLE DIRECTIVES INTO A FORM RECOGNIZED BY RSX EXTENDED ; LOGICAL SUPPORT. ; ; INPUTS: ; R0 - SIZE OF THE LOGICAL NAME TO BE PROCESSED ; R1 - 32 WD APR BIAS TO GET TO LOGICAL NAME ; R2 - KISAR6 VIRTUAL ADDRESS OF START OF LOGICAL NAME ; ; OUTPUTS: ; CS -> CONVERSION RESULTED IN INVALID LOGICAL NAME: R0 IS ZERO OR -1 ; CC -> CONVERSION RESULTED IN NONZERO LOGICAL NAME: ; R0 - SIZE OF THE LOGICAL NAME TO BE PROCESSED ; R1 - 32 WD APR BIAS TO GET TO LOGICAL NAME ; R2 - KISAR6 VIRTUAL ADDRESS OF START OF PROCESSED LOGICAL NAME ; ; THIS ROUTINE RECOGNIZES THAT IT WAS CALLED BY A TLOG$, RLOG$, CLOG$ OR ; DLOG$ DIRECTIVE AND PROCESSES THE LOGICAL NAME IN TWO WAYS. IF THE ; LOGICAL ENDS IN ONE OR TWO COLONS, THEY ARE STRIPPED OFF OF THE NAME. ; FOLLOWING THAT, THE STRING IS CHECKED TO SEE IF IT IS OF THE FORM OF ; AN RSX PHYSICAL DEVICE NAME (IE. DDNNN). IF SO, THE STRING IS ZERO ; COMPRESSED. IF IT ISN'T, THE ORIGINAL STRING IS USED, MINUS THE STRIPPED ; COLONS. ;- PSCNV: CMPB #R$XBAS,$DICSV+2;IS THIS ONE OF THE XLOG$ DIRECTIVES BLOS 10$ ;IF LOS, NO, SKIP PROCESSING TST R0 ;SEE IF THIS IS A FULL TABLE DELETE BNE 20$ ;IF NE, IT ISN'T, CONTINUE ON WITH PROCESSING 10$: CLC ;INDICATE SUCCESSFUL COMPLETION RETURN ; ; AT THIS POINT WE KNOW THIS IS A XLOG$ DIRECTIVE AND THAT THERE IS A NONZERO ; LENGTH OF STRING TO PROCESS. IF, AFTER STRIPPING 1-2 COLONS, THERE ISN'T ; ANY STRING LEFT, WE SET THE CARRY TO INDICATE AN INVALID INPUT STRING. R0 ; WILL BE INVALID AT THAT POINT AS WELL. ANY OTHER CONDITIONS WILL LEAVE THE ; CARRY CLEAR TO INDICATE A SUCCESSFUL OPERATION AND VALID REGISTERS. ; 20$: SAVNR ;SAVE REGISTERS R4,R5 MOV KISAR6,-(SP) ;SAVE THE DATA REGISTER VALUE MOV R3,-(SP) ;SAVE THE OTHER REGISTERS MOV R2,-(SP) ; MOV R1,-(SP) ; ADD R2,R0 ;POINT TO END OF LOGICAL NAME MOV R1,KISAR6 ;MAP THE LOGICAL NAME CMPB #':,-(R0) ;IS THIS A DEVICE OR NODE BNE 30$ ;IF NE, NO CMPB #':,-(R0) ;IS THIS A NODE BEQ 40$ ;IF EQ, YES 30$: INC R0 ;POINT BACK TO TERMINATOR 40$: SUB R2,R0 ;GET LENGTH OF STRING MOV R0,-(SP) ;GET THE NEW LENGTH OF STRING BLE 60$ ;IF LE, INVALID STRING MOV R0,R5 ;GET SIZE IN R5 MOV R2,R1 ;GET POINTER TO START OF STRING CALL DEVCHK ;SEE IF STRING MATCHES RSX PHYSICAL FORM BCS 50$ ;IF CS, NO, USE STRING WITHOUT COLONS TST R5 ;ANY LEFTOVER JUNK AFTER DEVICE BNE 50$ ;IF NE,YES, SKIP COMPRESSION MOV #$LTBUF,R3 ;POINT TO NEW PHYSICAL STRING MOV R2,(R3)+ ;MOVE IN DEVICE MNEMONIC CALL $DCBTA ;TURN OCTAL NUMBER INTO ASCII MOV R3,R0 ;INITIALIZE SIZE REGISTER SUB #$LTBUF,R0 ;GET ACTUAL SIZE OF LOGICAL NAME MOV #$LTBUF+20000,R2;GET VIRTUAL ADDRESS OF NEW LOGICAL NAME MOV KISAR5,R1 ;GET 32WD APR BIAS VALUE ADD #6,SP ;CLEAR STACK OF OLD VALUES CLC ;INDICATE SUCCESSFUL COMPLETION BR 70$ ; 50$: TST (PC)+ ;CLEAR CARRY TO INDICATE SUCCESS 60$: SEC ;INDICATE FAILURE MOV (SP)+,R0 ;RESTORE SIZE OF LOGICAL MOV (SP)+,R1 ;RESTORE 32WD APR BIAS TO LOGICAL MOV (SP)+,R2 ;RESTORE VIRTUAL ADDRESS OF LOGICAL 70$: MOV (SP)+,R3 ;RESTORE R3 MOV (SP)+,KISAR6 ;RESTORE ORIGINAL MAPPING RETURN ;+ ;LGTSET - ROUTINE TO SCAN A LOGICAL NAME DEFINED BY A DESCRIPTOR TO ; DETERMINE IF IT HAS A COLON IN IT. IF SO, THE LENGTH OF THE ; LOGICAL IS REDUCED TO INCLUDE THE STRING UP TO, BUT NOT ; INCLUDING, THE COLON. ; ; INPUTS: ; R0 - POINTER TO LOGICAL DESCRIPTOR ; OUTPUTS: ; R0 - UPDATED LENGTH OF LOGICAL IN DESCRIPTOR ;- LGTSET: SAVNR ;SAVE R4,R5 MOV 2(R0),KISAR6 ;MAP THE LOGICAL NAME WITH KISAR6 MOV 4(R0),R4 ;GET THE VIRTUAL ADDRESS OF THE LOGICAL START MOV (R0),R5 ;GET THE CURRENT LENGTH OF THE LOGICAL 10$: CMPB #':,(R4)+ ;IS THE NEXT CHARACTER A COLON BEQ 20$ ;IF EQ, YES DEC R5 ;DECREMENT THE COUNT OF CHARS TO PROCESS BNE 10$ ;IF NE, MORE TO PROCESS 20$: SUB R5,(R0) ;RESET LENGTH OF LOGICAL TO LOOKUP RETURN ;+ ; $MPHSH - ROUTINE TO MAP THE APPROPRIATE HASH TABLE THROUGH KISAR6 FOR A ; SPECIFIED LOGICAL TABLE NUMBER ; ; INPUTS: ; 6(R0) - CONTAINS A BYTE VALUE FOR THE TABLE NUMBER ; OUTPUT: ; CC -> SUCCESSFUL MAPPING OF HASH TABLE ADDRESS IN KISAR6 ; CS -> NO HASH TABLE WAS AVAILABLE FOR GIVEN TABLE NUMBER ;- $MPHSH:: MOV R3,-(SP) ;SAVE R3 ACROSS THE CALL MOVB 6(R0),R3 ;GET THE TABLE NUMBER CALL $TBTRL ;TRANSLATE TABNUM AND MAP HASH TABLE MOV (SP)+,R3 ;RESTORE R3 AND MAINTAIN CARRY BIT RETURN ;+ ; $TBTRL - ROUTINE TO TRANSLATE THE LOGICAL TABLE NUMBER INTO AN HASH TABLE ; OFFSET AND THEN MAP THE HASH TABLE THROUGH KISAR6 ; ; INPUTS: ; R3 - TABLE NUMBER ; OUTPUTS: ; CC - SUCCESS: ; KISAR6 - CONTAINS MAPPING TO START OF HASH TABLE ; CS - NO HASH TABLE VALUE AVAILABLE ; ; R3, KISAR6 ARE DESTROYED BY CALL ; ; THIS ROUTINE TAKES THE SPECIFIED LOGICAL TABLE NUMBER AND TURNS IT ; INTO A WORD OFFSET INTO THE HIERARCHY TABLE IN SYSCM. THE HIERARCHY ; TABLE CONTAINS THE SECONDARY POOL POINTERS TO EACH OF THE HASH TABLES ; IN AN ORDERED, PRECEDENCE-DERIVED SEQUENCE. SINCE THE TABLE NUMBERS ; NO LONGER HAVE ANY PRETENSE OF PRECEDENCE ORDERING, IT IS NECESSARY ; TO HASH THE VALUES INTO THE CORRECT WORD OFFSET. FROM THIS OFFSET, ; THE APR BIAS OF THE HASH TABLE IS PLACED INTO KISAR6 SO THAT ANY ; 140000-140100 KERNEL DATA REFERENCES WILL ACCESS THE HASH TABLE. ;- $TBTRL:: CMP #T$BLNM,R3 ;SEE IF THIS IS A VALID TABLE NUMBER BLO 10$ ;IF LO, NO, RETURN ERROR MOVB $TRANL(R3),R3 ;HASH TABLE NUMBER TO CORRECT OFFSET ASL R3 ;TURN INTO WORD OFFSET AND KEEP CC MOV $LOGTB(R3),KISAR6 ;MAP THE HASH TABLE THROUGH KISAR6 BNE 20$ ;IF NE, THERE WAS ONE 10$: SEC ;FAILURE INDICATOR 20$: RETURN .PAGE ;+ ; $LDELX - ROUTINE TO DELETE EVERY LOGICAL IN A GIVEN TABLE REGARDLESS OF ; THE BLOCK MODIFIER SPECIFIED. THIS ROUTINE IS USED BY ; DREIF TO ELIMINATE A TASK AND BY BYE TO LOGOFF A USER. ; ; INPUTS: ; R0 - POINTER TO TCB OR UCB TO DELETE LOGICALS FOR ; R1 - TABLE CODE INDICATING WHICH TABLE TO DELETE ; ;- $LDELX:: MOV R0,$TEMP0+10 ;PUT THE TCB/UCB ADDRESS INTO A PARTIAL DESC. MOV #$TEMP0,R0 ;SET UP THE DESCRIPTOR ADDRESS FOR $LNDAL MOV R1,6(R0) ;PUT THE TABLE NUMBER IN THE DESCRIPTOR ; THIS STATEMENT ALSO FORCES A ZERO IN 7(R0). ; THIS CAUSES $LNDAL TO SKIP BOTH THE MODE ; AND THE PRIVILEGE CHECKS. THIS IS TO ; PREVENT LOSS OF BLOCKS IN RUNDOWN. ;+ ; $LNDAL - ROUTINE TO DELETE ALL LOGICALS IN A GIVEN TABLE THAT MATCH THE ; BLOCK TYPE MODIFIER SPECIFIED IN THE DPB ; ; INPUTS: ; R0 - POINTER TO A LOGICAL NAME DESCRIPTOR BLOCK WITH NO SPECIFIED ; LOGICAL NAME ; OUTPUTS: ; CC - ALWAYS INDICATE SUCCESS ; ; A ZERO VALUE IN THE BLOCK BYTE - 7(R0) - FORCES A SKIP AROUND BOTH THE ; MODE AND THE LNB PRIVILEGE CHECKS. ;- $LNDAL:: SAVNR ;SAVE R4 AND R5 CLR -(SP) ;SET UP INITIAL VALUE FOR HASH TABLE CALL $MPHSH ;MAP THE HASH TABLE BCS 50$ ;IF CS, NO HASH TABLE ENTRY MOV KISAR6,(SP) ;SAVE THE HASH TABLE MAPPING CLR R1 ;INITIALIZE TO THE FIRST HASH CELL IN TABLE 10$: CLR R4 ;INITIALIZE PREVIOUS LNB ADDRESS IN LIST MOV (SP),KISAR6 ;MAP THE HASH TABLE MOV MAP6(R1),R3 ;GET FIRST ENTRY IN THE CELL LIST BEQ 40$ ;IF EQ, THERE ARE NONE, GO TO NEXT CELL 20$: MOV R3,KISAR6 ;MAP THE NEXT LNB CALL $LNTST ;CHECK TO SEE IF ENTRY MATCHES CRITERION BCC 30$ ;IF CC, IT DOES 23$: MOV R3,R4 ;IT DOESN'T, SET POINTERS AND GET NEXT ENTRY 25$: MOV MAP6+L.NLNK,R3 ;GET NEXT ENTRY ADDRESS BEQ 40$ ;IF EQ, THERE ARE NO MORE, GO TO NEXT CELL BR 20$ ;GO BACK AND CHECK THIS ENTRY 30$: TSTB 7(R0) ;SEE IF THIS IS A GENERIC COMPARE BEQ 35$ ;IF EQ, IT IS, IGNORE BLOCK NUMBER COMPARISONS CMPB MAP6+L.NBLK,7(R0);SEE IF THE BLOCK TYPES MATCH BNE 23$ ;IF NE, NO, DON'T DELETE CALL PRVTST ;CHECK FOR TASK PRIVILEGE TO DELETE BCS 23$ ;IF CS, TASK DOESN'T, SKIP THIS ONE 35$: MOV R4,-(SP) ;SAVE THE PREVIOUS LNB POINTER MOV R0,-(SP) ;SAVE THE STORAGE AREA ACROSS THE CALL CALL $LNELM ;ELMINATE THIS ENTRY MOV (SP)+,R0 ;RESTORE THE STORAGE AREA ADDRESS MOV (SP)+,R4 ;RESTORE THE PREVIOUS POINTER MOV R4,KISAR6 ;MAP THE PREVIOUS TO GET THE FORWARD POINTER BNE 25$ ;GO BACK AND CHECK THE NEXT ENTRY BR 10$ ;START AT THE HASH CELL IF NECESSARY 40$: ADD #2,R1 ;BUMP THE HASH CELL OFFSET WORD CMP R1,#<*2>;SEE IF END OF CELLS BLOS 10$ ;IF LOS, NO, DO MORE 50$: CLR (SP)+ ;POP THE HASH TABLE LOCATION AND SET CC RETURN .PAGE ;+ ; $TBSRC - ROUTINE TO DO HIERARCHICAL LOOKUPS IN THE APPROPRIATE LOGICAL ; NAME TABLES. THIS ROUTINE MUST BE PASSED A LOGICAL DESCRIPTOR ; BLOCK AND AN INHIBIT MASK WORD IN $TONYL. SEARCH WILL BEGIN AT ; THE TASK TABLE LEVEL, AND PROCEED SEQUENTIALLY TO THE SYSTEM ; LEVEL. IT IS UP TO THE CALLER TO MAKE SURE THAT THE INITIAL TCB ; OR UCB IS SET UP CORRECTLY IF ONE OF THE TABLES ARE TO BE INHIBITED. ; ; INPUTS: ; ; R0 - POINTER TO CURRENT DESCRIPTOR BLOCK WHICH CONTAINS: ; WD 1 - BYTE COUNT OF LOGICAL NAME ; WD 2 - 32 WD BLOCK ADDRESS OF LOGICAL NAME ; WD 3 - APR BIASED OFFSET TO START OF LOGICAL NAME ; WD 4 - TABLE # TO BE SEARCHED (LOW BYTE) ; BLOCK TYPE NUMBER (HIGH BYTE) ; WD 5 - MATCHING TCB OR UCB DEPENDING ON TYPE OF TABLE ; $TONYL - CONTAINS THE INHIBIT MASK WORD WHERE A SET BIT INDICATES THAT ; THAT THE TABLE IS TO BE SKIPPED IN THE LOOKUP. ; ; OUTPUTS: ; ; CC = 0 ; R3 - APR BIAS ADDRESS OF START OF MATCHING LNB ; ; CC = 1 ; R3,R4 INDETERMINATE ;- $TBSRC:: ; ; THE LOGICAL NAME IS NOW HASHED TO GET THE CELL OFFSET THAT WILL BE VALID ; ACROSS ALL TABLE LOOKUPS. THEN A LOOP IS ENTERED TO CHECK EACH TABLE FOR ; LOOKUP VALIDITY. IF IT IS VALID, THE TCB (IF A TASK TABLE LOOKUP) OR A ; UCB ADDRESS IS PLACED IN THE DESCRIPTOR BLOCK, AND THE APPROPRIATE TABLE ; IS SEARCHED FOR THE LOGICAL NAME. ; CALL $LNHSH ;HASH THE LOGICAL NAME TO GET CELL OFFSET CLR R2 ;INITIALIZE THE TABLE OFFSET BIT ; ; INITIALLY CHECK FOR A TASK LOGICAL TABLE LOOKUP. IT IS ASSUMED AT THIS ; POINT THAT THE DESCRIPTOR CONTAINS THE CORRECT TCB. IF THE LOOKUP FAILS ; FOR THE TASK TABLE, THE TCB IS USED TO GET THE APPROPRIATE UCB ADDRESS. ; THE UCB IS THEN PRESUMED TO BE IN THE DESCRIPTOR FOR ALL OTHER SEARCHES. ; CALL 50$ ;CHECK THE TASK LOGICAL TABLE BCC 40$ ;IF CC, THE LOGICAL WAS FOUND BVS 30$ ;IF VS, TABLE INHIBITED, DON'T TOUCH TCB MOV 10(R0),R5 ;GET THE TCB ADDRESS FROM THE DESCRIPTOR MOV T.UCB(R5),10(R0);AND PUT THE UCB ADDRESS BACK BR 30$ ;GO ON FOR THE OTHER TYPES OF LOOKUP ; ; THE FOLLOWING LOOKUPS ARE ONLY FOR THE USER, GROUP, AND SYSTEM LOOKUPS. ; FOR THE USER AND GROUP LOOKUPS, IT IS ASSUMED THAT THE CORRECT UCB IS ALREADY ; IN THE DESCRIPTOR BLOCK ; 20$: CALL 50$ ;VERIFY ONE OF THE USER, GROUP, OR SYSTEM TABLES BCC 40$ ;IF CC, THE LOGICAL WAS FOUND 30$: INC R2 ;BUMP TO NEXT TABLE CMP #T$BLNM,R2 ;ALL TABLES CHECKED BHIS 20$ ;IF HIS, NO, CONTINUE 35$: SEC ;INDICATE FAILURE TO FIND A MATCH 40$: RETURN ; ; ROUTINE TO DETERMINE IF THIS TABLE IS VALID AND IF THE LOGICAL IS WITHIN ; THE TABLE ; 50$: BITB $MSKBT(R2),$TONYL ;SEE IF SEARCH OF THIS TABLE IS INHIBITED SEV ;INITIALIZE TO TABLE INHIBITED BNE 35$ ;IF EQ, IT IS, CONTINUE WITH NEXT TABLE CLRB 6(R0) ;SET TABLE NUMBER TO BE SEARCHED IN DESCRIPTOR BISB $LTMSK(R2),6(R0); .PAGE ;+ ; $LNTBS - ROUTINE TO FIND A LOGICAL NAME STRING IN A SPECIFIC TABLE ; ; INPUTS: ; R0 - POINTER TO LOGICAL NAME DESCRIPTOR BLOCK ; BLOCK CONTAINS: ; WD 1 - BYTE COUNT OF LOGICAL NAME ; WD 2 - 32 WD BLOCK ADDRESS OF LOGICAL NAME ; WD 3 - APR BIASED OFFSET TO START OF LOGICAL NAME ; WD 4 - TABLE # TO BE SEARCHED (LOW BYTE) ; BLOCK TYPE NUMBER (HIGH BYTE) ; WD 5 - MATCHING TCB OR UCB DEPENDING ON TYPE OF TABLE ; R1 - WORD OFFSET TO BE USED TO FIND HASH CELL ; ; OUTPUTS: ; CC = 0 -> SUCCESSFUL MATCH OF LOGICAL NAME ; R3 = MATCHING LNB (32 WD BLOCK ADDRESS) ; R4 = PREVIOUS LNB IN LIST (32 WD BLOCK ADDRESS) ; CC = 1 -> UNSUCCESSFUL MATCH ; R3 = LOGICAL FITS BELOW THIS LNB (32 WD BLOCK ADDRESS) ; R4 = LOGICAL FITS ABOVE THIS LNB (32 WD BLOCK ADDRESS) ; ; R0,R1 IS PRESERVED ACROSS THE CALL ;+ $LNTBS:: MOV R1,-(SP) ;SAVE THE HASH CELL OFFSET MOV KISAR6,-(SP) ;SAVE THE CURRENT VALUE OF KERNEL D APR 6 CALL $MPHSH ;MAP THE HASH TABLE BCS 30$ ;IF CS, NO HASH TABLE AVAILABLE CLR R4 ;INITIALIZE PREVIOUS POINTER ADD #MAP6,R1 ;ADD A KISAR6 OFFSET TO THE HASH TABLE ENTRY SEC ;ASSUME THAT THERE ARE NO ENTRIES MOV (R1),R3 ;GET THE APR BIAS OF THE FIRST ENTRY BEQ 30$ ;IF NO ENTRY EXIT 10$: MOV R3,KISAR6 ;MAP THE NEXT ENTRY CMPB (R0),MAP6+L.NLNS;ARE THE LENGTHS OF THE ENTRIES THE SAME? BLO 30$ ;IF LO, NO - LOGICAL BELONGS HERE BEQ 20$ ;IF EQ, MAYBE, CONTINUE CHECKS 15$: MOV R3,R4 ;UPDATE THE PREVIOUS POINTER SEC ;ASSUME NO MORE ENTRIES MOV MAP6+L.NLNK,R3 ;GET THE NEXT ENTRY BIAS BEQ 30$ ;IF EQ, NO MORE, ENTRY BELONGS HERE BR 10$ ;GO BACK AND CHECK THE NEXT ENTRY 20$: CALL $LNTST ;CHECK THE TABLE PARAMETERS FOR A MATCH BCS 15$ ;IF CS, THEY DIDN'T MATCH, GET ANOTHER CALL $CMPST ;CONDITIONS MATCH, SEE IF LOGICAL IS SAME BCS 30$ ;IF CS, THEY DON'T - ENTRY BELONGS HERE THOUGH TST R1 ;IF R1 = 0 THIS IS A MATCH BNE 15$ ;IF NE, TRY THE NEXT ENTRY TSTB 7(R0) ;SEE IF THIS IS A GENERIC COMPARE BEQ 30$ ;IF EQ, IT IS, DON'T COMPARE BLOCK NUMBERS CMPB 7(R0),MAP6+L.NBLK ;LOGICAL IS CORRECT, IS BLOCK TYPE THE SAME? BHI 15$ ;IF HI, NO, GO BACK FOR NEXT ENTRY ;IF LO, CS IS SET - ENTRY BELONGS HERE ;IF EQ, CC IS CLEAR AND SUCCESS 30$: MOV (SP)+,KISAR6 ;RESTORE KERNEL MAPPING MOV (SP)+,R1 ;RESTORE THE HASH CELL OFFSET RETURN .PAGE ;+ ; $LNHSH - ROUTINE TO TURN A LOGICAL NAME STRING INTO A WORD OFFSET INTO ; A TO-BE-DETERMINED LOGICAL HASH TABLE ; ; INPUTS: ; R0 - POINTER TO LOGICAL NAME DESCRIPTOR BLOCK ; BLOCK CONTAINS: ; WD 1 - BYTE COUNT OF LOGICAL NAME ; WD 2 - 32 WD BLOCK ADDRESS OF LOGICAL NAME ; WD 3 - APR BIASED OFFSET TO START OF LOGICAL NAME ; OUTPUTS: ; R0 - SAME AS INPUT ; R1 - WORD OFFSET FROM START OF HASH TABLE TO CORRECT HASH CELL ; ; ALL CHARACTERS IN THE ASCII RANGE WITHIN THE LOGICAL ARE UPCASED BEFORE ; PROCESSING. ; ; *************************** TAKE NOTE ******************************** ; ; THIS ROUTINE MUST NOT BE CHANGED WITHOUT ; THE CORRESPONDING CHANGE TO THE SAME ROUTINE ; IN [70,10]ASNOV.MAC FOR VMR. ANY CHANGES MADE ; HERE AND NOT THERE WILL CAUSE AN INABILITY TO ; FIND AND DELETE LOGICALS CREATED BY VMR. ; ; ********************************************************************** ;+ $LNHSH:: CLR R1 ;INITIALIZE THE OFFSET VALUE MOV KISAR6,-(SP) ;SAVE CURRENT KISAR6 MAPPING MOV R0,-(SP) ;SAVE DESCRIPTOR BLOCK ADDRESS MOV R2,-(SP) ;SAVE THE INCOMING R2 MOV R3,-(SP) ;SAVE THE INCOMING R3 MOV (R0)+,R2 ;GET THE NUMBER OF BYTES IN THE LOGICAL BEQ 20$ ;NONE TO BE PROCESSED MOV (R0)+,KISAR6 ;MAP THE BLOCK TO BE HASHED MOV (R0)+,R3 ;GET THE OFFSET TO THE FIRST CHARACTER 10$: CALL $CVBUC ;GET THE NEXT CHARACTER IN UPPER CASE ADD R5,R1 ;SUM THE UPCASED CHARACTER VALUES OF LOGICAL SOB R2,10$ ;ALL THE VALUES OF THE LOGICAL MOV R1,R0 ;SQUARE THE VALUE CALL $MUL ; ASH #-5.,R1 ;SHIFT VALUE TO GET WORD OFFSET RANGE OF 0-31 BIC #177701,R1 ;BY TAKING THE MIDDLE 6 BITS OF VALUE 20$: MOV (SP)+,R3 ;RESTORE R3 MOV (SP)+,R2 ;RESTORE R2 MOV (SP)+,R0 ;RESTORE THE DESCRIPTOR BLOCK ADDRESS MOV (SP)+,KISAR6 ;RESTORE KERNEL MAPPING RETURN .PAGE ;+ ; $LNTST - ROUTINE TO MATCH THE TABLE PARAMETERS OF A DESCRIPTOR BLOCK AGAINST ; AN LNB IN THE LIST ; ; INPUTS: ; R0 - POINTER TO LOGICAL NAME DESCRIPTOR BLOCK ; BLOCK CONTAINS: ; WD 1 - BYTE COUNT OF LOGICAL NAME ; WD 2 - 32 WD BLOCK ADDRESS OF LOGICAL NAME ; WD 3 - APR BIASED OFFSET TO START OF LOGICAL NAME ; WD 4 - TABLE # TO BE SEARCHED (LOW BYTE) ; BLOCK TYPE NUMBER (HIGH BYTE) ; WD 5 - MATCHING TCB OR UCB DEPENDING ON TYPE OF TABLE ; R3 - APR BIAS TO THE START OF AN LNB IN A TABLE LIST ; ; KISAR6 MUST MAP THE LNB CURRENTLY IN R3 WHEN THIS ROUTINE IS INVOKED ; ; OUTPUTS: ; CC = 0 -> TABLE TYPES AND UCB/TCB/GROUP NUMBERS MATCH ; CC = 1 -> ENTRIES DO NOT MATCH IN SOME REGARD ; ;- $LNTST:: MOV R1,-(SP) ;SAVE THE CURRENT R1 MOV 6(R0),R1 ;GET THE TABLE NUMBER IN R1 CMPB #LT.TSK,R1 ;IS THE DESCRIPTOR ENTRY IN THE THE TASK TABLE BNE 20$ ;IF NE, NO, CONTINUE CHECKS 10$: CMP MAP6+L.NTCB,10(R0);DO THE TCB/UCB VALUES MATCH BEQ 40$ ;IF EQ, YES, EXIT SUCCESSFULLY BR 30$ ;IF NE, NO, EXIT UNSUCCESSFULLY 20$: CMPB #LT.SES,R1 ;IS THIS A SESSION TABLE CHECK BEQ 10$ ;IF EQ, YES CMPB #LT.GRP,R1 ;IS THIS A GROUP TABLE CHECK BNE 40$ ;IF NE, NO, IT IS A SYSTEM TABLE CHECK CALL GTUIC ;GET THE PROTECTION UIC GROUP CODE FROM $TKTCB CMPB MAP6+L.NGRP,R1 ;CHECK THE GROUP AGAINST THE PROTECTION UIC BEQ 40$ ;IF EQ, THEY ARE THE SAME 30$: SEC 40$: MOV (SP)+,R1 ;RESTORE R1 RETURN .PAGE ;+ ; $DCBTA - ROUTINE TO TURN A BINARY VALUE INTO AN ASCII TEXT STRING ; ; INPUTS: ; R0 - NUMBER TO BE TRANSLATED INTO ASCII ; R3 - POINTER TO BUFFER TO STORE TRANSLATED NUMBER ; ; OUTPUTS: ; R3 - POINTS PAST THE NUMBER STRING ; ; THIS ROUTINE WILL NOT TRANSLATE A ZERO UNIT NUMBER INTO AN ASCII DIGIT ; ;- $DCBTA::BIC #177400,R0 ;PREVENT SIGN PROPAG. IN ASH ;(0,R1 ;ADD SIZE OF HEADER,DPB,BUFFERED ;STORAGE AREA ; AND RETURNED SIZE BUFFER MOV R1,R4 ;SAVE SIZE OF REQUEST PACKET FOR CPSEN$ ADD #77,R1 ;ROUND R1 TO NEAREST 32. WORD BLOCK ASH #-6,R1 ; MOV #AL$BCK!AL$IMP,R0 ;BLOCK THE TASK, DO IMPLICIT START MOV R3,R5 ;SAVE DPB POINTER CALL $CPALO ;GET BUFFER FROM CPRBUF ; ; FILL IN REQUEST PACKET AND SEND TO CPRAME ; MOV R0,KISAR6 ;MAP PACKET MOV #MAP6,R1 ;GET ADDRESS OF HEADER MOVB #HT$DIR,H$TYPE(R1) ;DIRECTIVE REQUEST CLRB H$ICNT(R1) ;NO ITEMS ADD #P$DPB,R1 ;POINT TO DPB AREA MOV -2(R5),(R1)+ ;COPY DIC AND SIZE MOV (R5),(R1)+ ;COPY SUBFUNCTION CODE AND MODIFIER CLR (R1)+ ;RESERVED WORD MOV #,(R1)+ ;ADDRESS OF DEFAULT DIRECTORY ;BUFFER MOV 6(R5),(R1)+ ;SIZE OF DEFAULT DIRECTORY BUFFER CLR (R1)+ ;ASSUME NO RETURN SIZE REQUESTED TST 10(R5) ;SIZE BUFFER SPECIFIED? BEQ 110$ ;IF EQ NO MOV #,-(R1) ;ADDRESS OF USER SIZE BUFFER TST (R1)+ ;POINT TO NEXT WORD 110$: MOV 4(R5),(R1)+ ;STORE ADDRESS OF DIRECTORY BUFFER MOV 10(R5),(R1) ;STORE ADDRESS OF USER SIZE BUFFER (OR 0) CPSEN$ #SN$DIR,R0,R4 ;SEND REQUEST TO CPRAME ; ; GET RESPONSE PACKET AND ; TRANSFER BUFFERS INTO USER AREA ; MOV R0,-(SP) ;SAVE PACKET ADDRESS MOV R0,KISAR6 ;MAP PACKET CMP #IS.SUC,MAP6+H$STAT ;WAS SUCCESS RETURNED? BEQ 125$ ;IF EQ YES CMP #IE.RBS,MAP6+H$STAT ;WAS IS JUST A SIZE PROBLEM? BNE 200$ ;IF NE FATAL ERROR 125$: MOV MAP6+H$SIZE+GD$SIZ,R0 ;ADDRESS OF USER BUFFER MOV MAP6+H$SIZE+10,R1 ;SIZE OF BUFFER FROM DPB CALL $ACHKB ;DO ADDRESS CHECK BCS 240$ ;IF CS ERROR CALL $RELOC ;GET BIAS AND OFFSET OF BUFFER MOV R1,R3 ;SET UP DEST BIAS FOR BLXIO MOV R2,R4 ;SET UP DEST DISPLACEMENT MOV (SP),R1 ;SET UP SOURCE BIAS FOR APR5 MOV #,R2 ;SET UP SOURCE DISPLACEMENT MOV MAP6+H$SIZE+10,R0 ;GET SIZE FROM DPB TST MAP6+H$SIZE+12 ;WAS SIZE RETURNED BEQ 130$ ;IF EQ NO MOV R0,-(SP) ;SAVE BUFFER SIZE MOV MAP6+H$SIZE+GD$SIZ+GD$BUF,R5 ;GET RETURNED SIZE SUB R5,(SP)+ ;WILL THE STRING FIT? BMI 130$ ;IF MI NO MOV R5,R0 ;USE RETURNED SIZE 130$: CALL $BLXIO ;RETURN EQUIVALENCE NAME STRING TST MAP6+H$SIZE+12 ;WAS SIZE RETURNED? BEQ 200$ ;IF EQ NO MOV #200$,-(SP) ;SPECIFY $SGFIN RETURN ADDRESS CALL $SGFIN ;INHIBIT TRAPS MOV MAP6+H$SIZE+GD$SIZ+GD$BUF,-(SP) ;GET RETURNED SIZE MOV MAP6+H$SIZE+GD$SIZ+2,R3 ;GET ADDRESS OF USER BUFFER MTPD (R3) ;RETURN IT TO USER RETURN ;RETURN FROM $SGFIN 200$: MOV (SP)+,R0 ;GET BUFFER BIAS BACK CALLR $CPDEA ;DEALLOCATE BUFFER 240$: MOV (SP)+,R0 ;GET BUFFER BIAS BACK CALL $CPDEA ;DEALLOCATE BUFFER DRSTS D.RS98 ;ADDRESS CHECK ERROR .ENDC ; C$$RDR 10$: ADD #4,R3 ;POINT TO WD 3 OF THE DPB CALL ACROB ;CALCULATE BIAS AND DISPLACEMENT MOV R3,$TEMP0 ;SAVE DPB POINTER MOV R0,-(SP) ;SAVE SIZE OF DDS BUFFER MOV R1,R3 ;SET UP BUFFER BIAS FOR BLXIO MOV R2,R4 ;SET UP DISPLACEMENT MOV R5,R1 ;SET UP BIAS OF CONTEXT BLOCK MOV R5,KISAR6 ;MAP CTX BLOCK CLR R5 ; BISB C.DDSL+MAP6,R5 ;GET THE DDS LENGTH SUB R5,(SP) ;WILL THE NAME STRING FIT? BMI 20$ ;IF HI NO (USE ENTIRE USER BUFFER) MOVB C.DDSL+MAP6,R0 ;ADJUST AMOUNT TO COPY MOV #C.DDS+MAP5,R2 ;SET UP DISPLACEMENT OF STRING 20$: CALL $BLXIO ;RETURN EQUIVALENCE NAME STING MOV $TEMP0,R3 ;GET SAVED DPB POINTER TST (R3) ;WAS AN ADDRESS SPECIFIED TO RETURN ;THE LENGTH (BYTE COUNT) OF THE EQUIVALENCE ;NAME STRING INTO? BEQ 30$ ;IF EQ NO MOV #30$,-(SP) ;SPECIFY $SGFIN RETURN ADDRESS CALL $SGFIN ;INHIBIT TRAPS CLR -(SP) ;CLEAR LOCATION ON STACK BISB C.DDSL+MAP6,(SP) ;GET SIZE OF ENS MTPD @(R3) ;RETURN IT TO USER RETURN 30$: MOV (SP)+,R0 ;GET SIZE DIFERENCE BETWEEN USER BUFFER ;AND STRING BPL 40$ ;IF PL ENTIRE STRING WAS RETURNED DRSTS D.RS15 ;RETURN DIRECTIVE STATUS--'BUFFER TOO SMALL' 40$: RETURN .PAGE ;+ ; ; $LNFSD -- SET UP DEFAULT DIRECTORY STRING SUBFUNCTION ; ; THIS SUBFUNCTION SETS UP A SPECIFIC DEFAULT DIRECTORY STRING. ; IF SD.LOG IS SPECIFIED, THE DDS IN THE CONTEXT BLOCK POINTED TO ; BY THE USER TI: UCB WILL BE MODIFIED. IF THE MODIFIER IS ZERO, ; THE DDS IN THE CONTEXT BLOCK POINTED TO BY THE ISSUING TASK'S TCB ; WILL BE MODIFIED. IF SD.BYE IS SPECIFIED, THE USERS CONTEXT BLOCK ; WILL BE DELETED. ; ; INPUTS: ; R3 = ADDRESS OF DPB+2 ; R5 = THE ADDRESS OF THE TCB OF THE CURRENT TASK ; ; AFTER CALL TO ACROB: ; R0 = SIZE OF USER BUFFER (IN BYTES) ; R1 = BIAS OF USER BUFFER ; R2 = APR6 DISPLACEMENT TO USER BUFFER ; ; ; OUTPUTS: ; THE DEFAULT DIRECTORY STRING IS CREATED OR SUPERSEDS ; THE EXISTING STRING. IF A NULL STRING IS SPECIFIED, ; (I.E. NO BUFFER ADDRESS SPECIFIED IN THE DIRECTIVE) ; THEN THE DEFAULT DIRECTORY STRING FOR THE ISSUING TERMINAL ; IS DELETED. ; ; ;- $LNFSD:: CLR $TEMP0 ;ASSUME NO CTX BLOCK CMPB #SD.MOD,1(R3) ;IS THIS A TASK MODIFY REQUEST? BEQ 1000$ ;IF EQ YES CMPB #SD.MUD,1(R3) ;IS THIS A TERMINAL MUDIFY REQUEST? BNE 4$ ;IF NE NO,CONTINUE MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING MOV T.UCB(R5),R1 ;GET TI UCB ADDRESS MOV U.CTX(R1),-(SP) ;SAVE UCB'S DDS ADDRESS (IF ANY) BR 1010$ ;ENTER COMMON CODE 1000$: MOV KISAR6,-(SP) ;SAVE CURRENT MAPPING MOV T.CTX(R5),-(SP) ;GET TASK DDS ADDRESS (IF ANY) 1010$: MOV #2,R0 ;PRETEND 2 CHAR DDS MOV #"[],R1 ;PRETEND IT'S NONAMED MODE MOV (SP)+,KISAR6 ;GET DDS ADDRESS BEQ 2$ ;IF EQ NO CONTEXT, NONAMED MODE MOVB MAP6+C.DDSL,R0 ;GET LENGTH OF DDS MOV MAP6+C.DDS,R1 ;GET DDS 2$: MOV (SP)+,KISAR6 ;RESTORE MAPPING CMP #2,R0 ;LENGTH 2? BNE 3$ ;IF NE NO, KEEP GOING CMP #"[],R1 ;STRING="[]" BNE 3$ ;IF NE NO, KEEP GOING .IF DF C$$RDR ;REMOTE DIRECTORY SUPPORT BIT #F5.RDR,$FMSK5 ;USING REMOTE DIRECTORIES? BEQ 25$ ;NO. JUST EXIT AT THIS TIME MOV 6(R3),R1 ;GET DDS LENGTH BEQ 185$ ;IF EQ ILLEGAL SIZE FOR DDS CMP #11.,R1 ;MAX LENGTH OF DDS BUFFER IS 11. BGE 199$ ;OK, CONTINUE BR 185$ ;BUFFER TOO LONG 25$: .ENDC ;C$$RDR DRSTS D.RS00 ;RETURN IS.CLR 3$: ASSUME SD.MOD,7 ASSUME SD.MUD,8. BICB #SD.MOD,1(R3) ;CLEAR THE SD.MOD BITS IN THE SUBFUNCTION ;CODE. THIS SHOULD LEAVE 0 IF SD.MOD, SD.MUD ;(NOT ZERO) IF SD.MUD. BEQ 4$ ;IF EQ WAS SD.MOD, 0 IS CORRECT REPLACEMENT MOVB #SD.LOG,1(R3) ;COMMUTE SD.MUD INTO SD.LOG 4$: CMPB #SD.TI,1(R3) ;SD.TI MODIFIER? BEQ 150$ ;YES. GO CLEAR BUFFER LENGTH CMPB #SD.BYE,1(R3) ;SD.BYE MODIFIER? BNE 160$ ;NO MOV T.UCB(R5),R0 ;GET TI:UCB ADDRESS BIT #DV.PSE,U.CW1(R0) ;PSEUDO DEVICE? BNE 165$ ;YES. NOT ALLOWED 150$: CLR R1 ;NO DDS LENGTH IN SD.BYE BR 198$ ;CONTINUE 160$: MOV 6(R3),R1 ;GET DDS LENGTH BEQ 185$ ;IF EQ ILLEGAL SIZE FOR DDS CMPB #SD.LOG,1(R3) ;SD.LOG MODIFIER? BNE 170$ ;NO MOV T.UCB(R5),R0 ;GET TI:UCB ADDRESS BIT #DV.PSE,U.CW1(R0) ;PSEUDO DEVICE? BEQ 180$ ;NO. CONTINUE 165$: DRSTS D.RS21 ;RETURN - NAME NOT FOUND 170$: TSTB 1(R3) ;TEST MODIFIER BEQ 180$ ;IT IS ZERO. OTHERWISE ERROR BECAUSE ; HAS NOT BEEN SD.TI, SD.BYE, SD.LOG DRSTS D.RS99 ;INVALID MODIFIER 180$: CMP #11.,R1 ;MAX LENGTH OF DDS BUFFER IS 11. BGE 190$ ;OK, CONTINUE 185$: DRSTS D.RS89 ;INVALID BUFFER LENGTH 190$: MOV R1,-(SP) ;SAVE DDS LENGTH MOV R3,-(SP) ;SAVE DPB+2 POINTER ADD #4,R3 ;POINT TO WORD 3 OF THE DPB CALL ACROB ;CALCULATE BIAS AND DISPLACEMENT SUB #MAP6-MAP5,R2 ;MAKE BIAS APR5 RATHER THAN APR6 CALL $CRCTX ;CREATE A CTX BLOCK BCC 195$ ;SUCCESS DRSTS D.RS1 ;FAILED TO CREATE. NO POOL 195$: MOV R3,$TEMP0 ;SAVE CTX BLOCK POINTER MOV (SP)+,R3 ;RESTORE DPB+2 POINTER MOV (SP)+,R1 ;RESTORE DDS LENGTH 198$: .IF DF C$$RDR ; REMOTE DIRECTORY SUPPORT BIT #F5.RDR,$FMSK5 ;ARE WE USING REMOTE DIRECTORY STORAGE? BNE 199$ ;IF NE YES JMP 1$ ;JUST DO LOCAL SDIR 199$: ; ; GET A REQUEST PACKET FROM CPRBUF ; CMP R1,#LN$SIZ ;IS SIZE TOO BIG? NOTE CPRSX WILL ALLOW ; 255 BUT RSX WILL ONLY ALLOW 11 FOR NOW BHI 185$ ;IF HI YES ADD #,R1 ;ADD SIZE OF HEADER,DPB,EXTRA STORAGE MOV R1,R4 ;SAVE SIZE OF REQUEST PACKET FOR CPSEN$ ADD #77,R1 ;ROUND R1 TO NEAREST 32. WORD BLOCK ASH #-6,R1 ; MOV R3,R5 ;SAVE DPB POINTER MOV #AL$BCK!AL$IMP,R0 ;BLOCK THE TASK, DO IMPLICIT START CALL $CPALO ;GET BUFFER FROM CPRBUF MOV R5,R3 ;RESTORE DPB POINTER ; ; FILL IN REQUEST PACKET ; MOV R4,-(SP) ;SAVE SIZE OF REQUEST MOV R0,-(SP) ;SAVE PACKET BIAS MOV R0,KISAR6 ;MAP PACKET MOV #MAP6,R1 ;GET ADDRESS OF HEADER MOVB #HT$DIR,H$TYPE(R1) ;DIRECTIVE REQUEST CLRB H$ICNT(R1) ;NO ITEMS ADD #P$DPB,R1 ;POINT TO DPB AREA MOV -2(R5),(R1)+ ;COPY DIC AND SIZE MOV (R5)+,(R1)+ ;COPY SUBFUNCTION CODE AND MODIFIER MOV (R5)+,(R1)+ ;RESERVED WORD MOV #,(R1)+ ;ADDRESS OF DEFAULT DIR BUFFER MOV (R5)+,R0 ;USER ADDRESS OF BUFFER MOV (R5),(R1)+ ;SIZE OF DEFAULT DIRECTORY BUFFER MOV R0,(R1)+ ;ADDRESS OF USER BUFFER MOV R3,(R1) ;DPB POINTER MOV $TEMP0,2(R1) ;SAVE CTX POINTER CMPB #SD.BYE,1(R3) ;SD.BYE? BEQ 220$ ;IF EQ YES CMPB #SD.TI,1(R3) ;SD.TI? BEQ 220$ ;IF EQ YES MOV (R5),R1 ;SIZE OF BUFFER FOR ADDRESS CHECK CALL $ACHKB ;CHECK ADDRESS BCS 300$ ;IS CS ERROR CALL $RELOC ;GET SOURCE BIAS AND DISPLACEMENT SUB #MAP6-MAP5,R2 ;MAKE SOURCE DISPLACEMENT AN APR5 DISPLACEMENT MOV (SP),R3 ;GET DEST BIAS MOV #,R4 ;GET DEST DISPLACEMENT MOV MAP6+P$DPB+10,R0 ;GET SIZE OF TRANSFER CALL $BLXIO ;TRANSFER DIRECTORY SPEC INTO BUFFER CMP #2,MAP6+P$DPB+10 ;COULD THIS BE []? BNE 220$ ;IF NE NO CMP #"[],MAP6+H$SIZE+SD$SIZ+6 ;IS IT []? BNE 220$ ;IF NE NO ADD #2,2(SP) ;INCLUDE EXTRA WORD IN PACKET MOV $TKTCB,R5 ;GET TCB ADDRESS MOV T.UCB(R5),R5 ;GET UCB ADDRESS MOV U.LUIC(R5),MAP6+H$SIZE+SD$SIZ+10 ;STORE UIC 220$: MOV (SP)+,R0 ;GET PACKET BIAS BACK MOV (SP)+,R4 ;GET PACKET LENGTH BACK CPSEN$ #SN$DIR,R0,R4 ;SEND REQUEST TO CPRAME MOV R0,KISAR6 ;MAP PACKET MOV MAP6+P$DPB+SD$SIZ+4,$TEMP0 ;GET CTX POINTER BACK TST MAP6+H$STAT ;IS STATUS SUCCESS? BMI 400$ ;IF MI, ERROR MOV #MAP6+P$DPB,R1 ;POINT TO DPB MOV SD$SIZ+2(R1),R3 ;GET DPB POINTER BACK MOV SD$SIZ(R1),6(R1) ;PUT ADDRESS OF USER BUFFER BACK IN DPB MOV R3,R5 ;COPY DPB POINTER SUB #2,R5 ;BACK UP TO BEGINNING OF DPB MOV #SD$SIZ/2,R2 ;GET SIZE OF DPB IN WORDS 250$: MOV (R1)+,(R5)+ ;COPY DPB BACK SOB R2,250$ ;LOOP UNTIL DONE MOV R3,-(SP) ;SAVE DPB POINTER CALL $CPDEA ;DEALLOCATE PACKET MOV (SP)+,R3 ;RESTORE DPB POINTER MOV $TKTCB,R5 ;GET TASK TCB ADDRESS CMPB 1(R3),#SD.MOD ;IS THIS SD.MOD OR SD.MUD? ; VERY IMPORTANT NOTE. ; ; THE FOLLOWING BRANCH DEPENDS ON THE FACT THAT SD.MUD > SD.MOD, AND ; THAT SD.ANYTHING_ELSE ISN'T. IF ANOTHER SD. IS ADDED, THIS BRANCH ; LOGIC MUST BE CHANGED. BLT 1$ ;IF NE NO RETURN ;MAKE SURE WE STAY IN NONAMED MODE 300$: MOV $TEMP0,R1 ;POINT TO ALLOCATED CTX BEQ 310$ ;NONE WAS ALLOCATED CALL $DLCTX ;DELETE IT 310$: MOV (SP)+,R0 ;GET PACKET BIAS TST (SP)+ ;CLEAN OFF STACK CALL $CPDEA ;DEALLOCATE BUFFER DRSTS D.RS98 ;ADDRESS ERROR 400$: MOV $TEMP0,R1 ;POSSIBLY POINT TO ALLOCATED CTX BEQ 410$ ;NONE WAS ALLOCATED CALL $DLCTX ;IT WAS ALLOCATED. DELETE IT 410$: CALLR $CPDEA ;DEALLOCATE PACKET AND RETURN 1$: .ENDC ; C$$RDR TSTB 1(R3) ;CHECK MODIFIER IN DPB BEQ 30$ ;USE CTX FROM TCB CMPB #SD.TI,1(R3) ;WAS SD.TI SPECIFIED? BNE 10$ ;IF NE, NO MOV T.CTX(R5),-(SP) ;GET TASK'S CONTEXT BLOCK POINTER MOV T.UCB(R5),R1 ;GET TI: UCB CMP U.CTX(R1),(SP)+ ;IS TERMINAL CONTEXT SAME AS TASK? BNE 5$ ;IF NE, MORE WORK TO DO RETURN ;RETURN WITH SUCCESS 5$: MOV T.CTX(R5),R1 ;GET TERMINAL CONTEXT CALL $DLCTX ;DELETE TASKS CURRENT CONTEXT MOV T.UCB(R5),R1 ;GET TI: UCB AGAIN MOV U.CTX(R1),T.CTX(R5) ;SET TASK CONTEXT TO TERMINAL CONTEXT BEQ 65$ ;IF EQ, DONE MOV KISAR6,-(SP) ;SAVE MAPPING MOV U.CTX(R1),KISAR6 ;MAP CONTEXT BLOCK INCB C.REF+140000 ;INCREMENT REFERENCE COUNT MOV (SP)+,KISAR6 ;RESTORE MAPPING BR 65$ ;INDICATE NAME SUPERCEDED 10$: MOV T.UCB(R5),R5 ;GET TI: UCB ADDRESS ; ; IF SD.BYE, DELETE CONTEXT BLOCK AND RETURN STATUS ; CMPB #SD.BYE,1(R3) ;SD.BYE SPECIFIED? BNE 30$ ;IF NE, NO. MUST BE AN SD.LOG MOV U.CTX(R5),R1 ;GET USER CONTEXT BLOCK (BIAS) CALL $DLCTX ;DEALLOCATE CTX BLOCK CLR U.CTX(R5) ;ZERO CONTEXT BLOCK POINTER .IF DF C$$RDR ;REMOTE DIRECTORY BIT #F5.RDR,$FMSK5 ;ARE WE USING REMOTE DIRECTORY STORAGE? BEQ 15$ 14$: RETURN ;DSW ALREADY SET BY KXDRV 15$: .ENDC ;C$$RDR DRSTS D.RSP3 ;RETURN STATUS OF 'NAME SUPERSEDED' 30$: MOV R3,R2 ;MOVE DPB+2 POINTER TO R2 MOV $TEMP0,R3 ;PREVIOUSLY ALLOCATED CTX BLOCK CMPB #SD.LOG,1(R2) ;WAS SD.LOG SPECIFIED? BNE 40$ ;IF NE, NO MOV U.CTX(R5),R1 ;GET CONTEXT BLOCK POINTER FROM UCB BEQ 60$ ;IF EQ, NO CURRENT CTX CALL $DLCTX ;DELETE OLD CONTEXT BR 60$ ;UPDATE CTX POINTER IN UCB 40$: MOV T.CTX(R5),R1 ;GET CONTEXT BLOCK POINTER FROM TCB BEQ 50$ ;IF EQ, NO CURRENT CTX CALL $DLCTX ;DELETE OLD CONTEXT 50$: MOV R3,T.CTX(R5) ;PUT NEW CTX POINTER IN TCB .IF DF C$$RDR ;REMOTE DIRECTORY BIT #F5.RDR,$FMSK5 ;ARE WE USING REMOTE DIRECTORY STORAGE? BEQ 55$ RETURN ;DSW ALREADY SET BY KXDRV 55$: .ENDC ;C$$RDR DRSTS D.RSP3 ;STATUS OF 'NAMED SUPERCEDED' 60$: MOV R3,U.CTX(R5) ;PUT NEW CTX POINTER IN UCB MOV KISAR6,-(SP) ;SAVE MAPPING MOV R3,KISAR6 ;MAP CONTEXT BLOCK MOV #C.DDS+140001,R0 ;POINT TO FIRST CHAR OF DDS MOV R5,-(SP) ;SAVE UCB ADDRESS CALL CNTB ;CONVERT DDS TO BINARY EQUIV, IF POSSIBLE MOV (SP)+,R5 ;RESTORE UCB ADDRESS MOV (SP)+,KISAR6 ;RESTORE MAPPING BCC 62$ ;IF CC, CONVERSION DONE MOV U.LUIC(R5),U.UIC(R5) ;SET DEFAULT UIC = PROTECTION UIC BR 65$ ; 62$: MOV R1,U.UIC(R5) ;SET DEFAULT UIC = BINARY EQUIV OF DDS 65$: .IF DF C$$RDR ;REMOTE DIRECTORY BIT #F5.RDR,$FMSK5 ;ARE WE USING REMOTE DIRECTORY STORAGE? BEQ 68$ RETURN ;DSW ALREADY SET BY KXDRV 68$: .ENDC ;C$$RDR DRSTS D.RSP3 ;STATUS OF 'NAME SUPERCEDED' ; ; CNTB - CONVERT A NAMED DIRECTORY TO A BINARY WORD IF ; IN THE FORM OF [G,M] OR [GGGMMM] ; ; INPUTS: R0 = BUFFER POINTER ; ; OUTPUTS: IF CC, R1 = BINARY WORD ; IF CS, INDICATES NAMED DIRECTORY NOT CONVERTED ; CNTB: CLR -(SP) ; USE STACK FOR FLAG WORD MOV #3,R4 ; NUMBER OF CHARS TO CONVERT CLR R1 ; CLEAR ACCUMULATED VALUE MOVB #',,R2 ; STOP ON A COMMA CALL 100$ ; CONVERT BCS 20$ ; BR IF INVALID MOV R1,R3 ; STORE RESULT BEQ 20$ ; IF EQ, INVALID MOV #3,R4 ; NUMBER OF CHARS TO CONVERT CLR R1 ; CLEAR ACCUMULATED VALUE CMPB #',,(R0) ; POINTING TO A COMMA? BNE 10$ ; IF NE, NO TSTB (R0)+ ; SKIP THE COMMA INC (SP) ; INDICATE COMMA SEEN 10$: MOVB #'],R2 ; STOP ON A BRACKET CALL 100$ ; CONVERT BCS 20$ ; BR IF INVALID SWAB R3 ; PUT GROUP CODE IN HIGH BYTE BIS R3,R1 ; PUT INTO RESULT BEQ 20$ ; IF EQ, INVALID CMPB #'],(R0)+ ; ENDING BRACKET? BNE 20$ ; IF NE, ERROR TST (SP) ; DID WE SEE A COMMA? BNE 15$ ; IF NE, YES TST R4 ; VERIFY WE PARSED 3 CHARS BNE 20$ ; IF NE, - ERROR 15$: TST (SP)+ ; CLEAN STACK, INDICATE SUCCESS BR 30$ ; RETURN TO CALLER WITH CC 20$: TST (SP)+ ; CLEAN STACK SEC ; INDICATE DIRECTORY NOT CONVERTED 30$: RETURN ; AND RETURN TO CALLER 100$: MOVB (R0)+,R5 ; GET NEXT CHAR CMPB R2,R5 ; IS THIS ENDING CHARACTER? BEQ 115$ ; BR IF YES SUB #'0,R5 ; SUBTRACT CHARACTER BIAS BMI 120$ ; IF MI, ILLEGAL CHAR CMPB R5,#8. ; CHECK AGAINST BASE BHIS 120$ ; IF HIS, ILLEGAL CHAR MUL #8.,R1 ; MULT RESULT BY BASE ADD R5,R1 ; ACCUMULATE RESULT SOB R4,100$ ; GO AGAIN 110$: CMP #377,R1 ; NUMBER GREATER THAN 377? RETURN ; RETURN TO ABOVE 115$: TSTB -(R0) ; BACK UP CMP #3,R4 ; DID WE PARSE ANYTHING? BNE 110$ ; IF NE, YES - OK 120$: SEC ; INVALID CHARACTER TO CONVERT RETURN ; RETURN TO ABOVE .ENDC ;DF N$$DIR .END